MyCATApache / Mycat-Server

GNU General Public License v2.0
9.51k stars 3.85k forks source link

cannot be cast to com.alibaba.druid.sql.dialect...... #2846

Open 3721518 opened 3 years ago

3721518 commented 3 years ago

模拟方法:使用navicat手动运行自定义函数并输入参数名后其某个表的值没有被更新。 Mycat版本:mycat-1.6.7.6-20210831 Mycat日志内容: 2021-09-08 10:20:26.430 DEBUG [$_NIOREACTOR-2-RW] (io.mycat.net.FrontendConnection.query(FrontendConnection.java:358)) - ServerConnection [id=6, schema=cloud_one, host=10.10.81.249, user=mycat_user,txIsolation=3, autocommit=true, schema=cloud_one, executeSql=null] SET @in_queue_name = 'InitialWeight' 2021-09-08 10:20:26.430 DEBUG [$_NIOREACTOR-2-RW] (io.mycat.server.ServerQueryHandler.query(ServerQueryHandler.java:70)) - ServerConnection [id=6, schema=cloud_one, host=10.10.81.249, user=mycat_user,txIsolation=3, autocommit=true, schema=cloud_one, executeSql=SET @in_queue_name = 'InitialWeight']SET @in_queue_name = 'InitialWeight' 2021-09-08 10:20:26.431 DEBUG [$_NIOREACTOR-2-RW] (io.mycat.server.interceptor.impl.GlobalTableUtil.consistencyInterceptor(GlobalTableUtil.java:89)) - before intercept: SET @in_queue_name = 'InitialWeight' 2021-09-08 10:20:26.431 WARN [$_NIOREACTOR-2-RW] (io.mycat.server.interceptor.impl.GlobalTableUtil.convertUpdateSQL(GlobalTableUtil.java:514)) - com.alibaba.druid.sql.ast.statement.SQLSetStatement cannot be cast to com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement 2021-09-08 10:20:26.431 DEBUG [$_NIOREACTOR-2-RW] (io.mycat.server.interceptor.impl.GlobalTableUtil.consistencyInterceptor(GlobalTableUtil.java:102)) - after intercept: SET @in_queue_name = 'InitialWeight' 2021-09-08 10:20:26.431 DEBUG [$_NIOREACTOR-2-RW] (io.mycat.server.ServerConnection.routeEndExecuteSQL(ServerConnection.java:362)) - add queue,executeSqlQueue size 1

junwen12221 commented 3 years ago

把useGlobleTableCheck 这个属性设置为0

3721518 commented 3 years ago

如果把useGlobleTableCheck置为0,在调用自定义函数时,一个函数提里包含了update操作,但是不返回值; 就是存储函数不返回值

junwen12221 commented 3 years ago

http://dl.mycat.org.cn/1.6.7.6/20210908145008/Mycat-server-1.6.7.6-release-20210908145008-linux.tar.gz 已经修复此异常

另外可以描述一下你所需的场景吗

3721518 commented 3 years ago

上面那个我开启DEBUG模式使用后查看确实不显示WARN了,但是函数还是不反回值啊,老大!!!

junwen12221 commented 3 years ago

https://blog.csdn.net/qq_31183071/article/details/102653151

看看能不能把值存到变量里,再select出来

3721518 commented 3 years ago

代码里用去执行这个SELECT get_queue("Fasti"),他的autocommit=false,而用navicat连接mycat手动开启一个,它的autocommit=true 就是这样实现的,值是存到变量里的

junwen12221 commented 3 years ago

现在遇上了什么问题,存到变量里,select不出来吗

3721518 commented 3 years ago

函数体: CREATE DEFINER=root@% FUNCTION get_queue(in_queue_name varchar(30)) RETURNS int BEGIN

Routine body goes here...

declare queue_out int;
set @queue_out = 1;

update t_queue_faces t 
set t.queue_value = (@queue_out:=t.queue_value+1) 
where t.queue_name = in_queue_name;
RETURN @queue_out;

END 使用方法:代码里执行SELECT get_queue("Fasti"),永远取的是默认值1,这是不对的没有走update语句; 解决方法:考虑可能是事务的问题,在代码里加事务就能获取我想要的值;

junwen12221 commented 3 years ago

是这样的,mycat对后端连接有连接池,设置的变量跟随后端连接,所以需要开启事务使一次sql响应后不释放连接,这样变量可以再下一次请求中能获取到

3721518 commented 3 years ago

能不能有什么解决方法呢?

junwen12221 commented 3 years ago

要改一下代码

3721518 commented 3 years ago

要改我业务代码吗,那如果说我代码里都有很多调用函数的方法(select get_queue("1|2|3|4"),那不是要改废掉了吗。况且没有扩展性也对性能照成极大影响!!!

3721518 commented 3 years ago

有个很特别的问题,我使用mycat用户user其正常映射到后端的root用户上,有超级权限的。 但为什么我使用navicat客户端去连接mycat节点后,通过select出数据直接鼠标点击更新某个表字段,为什么改不了呢,只能使用sql语句才能更新,为什么呢?

junwen12221 commented 3 years ago

第一个问题,要改mycat源码,第二个是,navicat是客户端适配问题,mycat1.6不支持一些show语句导致navicat有些功能无法使用

3721518 commented 3 years ago

1,Mycat能否设置所有自定义函数,走主库! 2、我就使用读写分离,框架控制的默认是自动提交,事务走主库,非事务走的是读库是吗! 3、Mycat如何设置所有事务走主库,不要判断是否回滚,很麻烦! 4、我看了下日志,[id=80],这个id是一个查询发起的吗,为什么客户端发起一个查询但是id对不上呢!

junwen12221 commented 3 years ago

纯代理场景不太适合分库分表中间件的,读写分离用官方的proxy或者jdbc这种客户端就内置读写分离功能

3721518 commented 3 years ago

我的心啊,因为sql的问题,改代码改的心都碎了

junwen12221 commented 3 years ago

这个其实改mycat代码定制几个存储过程也是可以的,多了也不行