Open 3721518 opened 3 years ago
把useGlobleTableCheck 这个属性设置为0
如果把useGlobleTableCheck置为0,在调用自定义函数时,一个函数提里包含了update操作,但是不返回值; 就是存储函数不返回值
上面那个我开启DEBUG模式使用后查看确实不显示WARN了,但是函数还是不反回值啊,老大!!!
https://blog.csdn.net/qq_31183071/article/details/102653151
看看能不能把值存到变量里,再select出来
代码里用去执行这个SELECT get_queue("Fasti"),他的autocommit=false,而用navicat连接mycat手动开启一个,它的autocommit=true 就是这样实现的,值是存到变量里的
现在遇上了什么问题,存到变量里,select不出来吗
函数体:
CREATE DEFINER=root
@%
FUNCTION get_queue
(in_queue_name
varchar(30)) RETURNS int
BEGIN
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语句; 解决方法:考虑可能是事务的问题,在代码里加事务就能获取我想要的值;
是这样的,mycat对后端连接有连接池,设置的变量跟随后端连接,所以需要开启事务使一次sql响应后不释放连接,这样变量可以再下一次请求中能获取到
能不能有什么解决方法呢?
要改一下代码
要改我业务代码吗,那如果说我代码里都有很多调用函数的方法(select get_queue("1|2|3|4"),那不是要改废掉了吗。况且没有扩展性也对性能照成极大影响!!!
有个很特别的问题,我使用mycat用户user其正常映射到后端的root用户上,有超级权限的。 但为什么我使用navicat客户端去连接mycat节点后,通过select出数据直接鼠标点击更新某个表字段,为什么改不了呢,只能使用sql语句才能更新,为什么呢?
第一个问题,要改mycat源码,第二个是,navicat是客户端适配问题,mycat1.6不支持一些show语句导致navicat有些功能无法使用
1,Mycat能否设置所有自定义函数,走主库! 2、我就使用读写分离,框架控制的默认是自动提交,事务走主库,非事务走的是读库是吗! 3、Mycat如何设置所有事务走主库,不要判断是否回滚,很麻烦! 4、我看了下日志,[id=80],这个id是一个查询发起的吗,为什么客户端发起一个查询但是id对不上呢!
纯代理场景不太适合分库分表中间件的,读写分离用官方的proxy或者jdbc这种客户端就内置读写分离功能
我的心啊,因为sql的问题,改代码改的心都碎了
这个其实改mycat代码定制几个存储过程也是可以的,多了也不行
模拟方法:使用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