MyCATApache / Mycat-Server

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

JDBC连接Mycat执行节点的存储过程 #2678

Open ghostanwb opened 3 years ago

ghostanwb commented 3 years ago
    con.setAutoCommit(false);
    stmt = con.createStatement();
    //String sql ="insert into black_list values('62800001','62800001');";
    //int ret = stmt.executeUpdate(sql);// 执行SQL语句并返回结果集 

    stmt.executeUpdate("/** mycat:schema=LINA */SET autocommit = 0;");
    stmt.executeUpdate("/** mycat:schema=LINA */SET @caller='18918939393';");
    stmt.executeUpdate("/** mycat:schema=LINA */CALL test(@caller,@ret);");
    ResultSet resultSet = stmt.executeQuery("/** mycat:schema=LINA */select @ret as ret;");
    boolean next = resultSet.next();
    Object object = resultSet.getObject(1);

卡在 stmt.executeUpdate("/* mycat:schema=LINA /CALL test(@caller,@ret);");这句 直到超时 经过测试proc里面执行的插入和更新都已经完成了 这是什么配置不对吗? mycat连接的是mariadb10.5.8的galera集群,读写分离没有分片

junwen12221 commented 3 years ago

https://github.com/MyCATApache/Mycat-Server/issues/2593

ghostanwb commented 3 years ago

重新调试后发现问题出在mariadb的proc中使用select输出了结果集 如果这种情况,调用存储过程的代码应该如何书写,mysql和sqlserver这类结果集不在输入输出参数的列表的存储过程 原本jdbc使用executeQuery调用,Mycat的注释应该如何书写? stmt.executeUpdate("/* mycat:schema=LINA,list_fields='@p_CURSOR' /CALL test(@caller,@ret);"); 这样的书写似乎没有效果,还是会卡死

junwen12221 commented 3 years ago

mycat没有支持后端接收存储过程的特殊报文,一直使用的方法是在sql中把这个特殊结果存放到变量里,然后select出来,此时这个结果就会变成普通的结果集,能被mycat处理

ghostanwb commented 3 years ago

是不是输出结果集的mysql存储过程mycat是不支持的, 如果jdbc直连mysql执行存储过程先读取结果集,结果集关闭后再取输出参数的方式,这样的存储过程都不能被mycat使用? 那么文档中 11章3.返回结果中有结果集时,则必须加注解,且注解中必须在 list_fields 中包括所有结果集参数名称,以逗号隔开 结果集参数必须在最后 /#mycat: sql=SELECT FROM test where id=1 ,list_fields='@p_CURSOR,@p_CURSOR1' */ 又是什么意思呢?

junwen12221 commented 3 years ago

list_fields='@p_CURSOR,@p_CURSOR1' 这个你要看源码确认一下,好像是数据源是jdbc的时候.oracle的数据源的时候支持游标运算.类似地,可以通过修改源码使用jdbc实现mysql相同的功能