测试版本:mycat 1.6.74
2019-11-20 06:23:27之后
dn4的配置<dataNode name="dn4" dataHost="localhost4" database="db1" />
localhost4是mysql数据源
mycat中会对一些sql语句进行随机路由(一般是没有from的查询sql)
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn4">
randomDataNode="dn1" 可以强制把这些sql发送指定节点
db1中的存储过程
DELIMITER &&
CREATE PROCEDURE p_test2(OUT p_id INT)
BEGIN
SET p_id = 22; -- 将 p_id 赋值为 22
END&&
DELIMITER ;
JDBC使用存储过程的方法
connection.setAutoCommit(false);
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("/* mycat:dataNode = dn4 */SET @P_id = 100;\n");
statement.executeUpdate("/* mycat:dataNode = dn4 */CALL p_test2(@p_id);");
ResultSet resultSet = statement.executeQuery("/* mycat:dataNode = dn4 */SELECT @p_id AS c;");
boolean next = resultSet.next();
Object object = resultSet.getObject(1);//22
}
//提交事务?
如果出现后端连接提早释放可以开启严格事务
有randomDataNode的情况下实际上也不需要写注解了直接
SET autocommit = 0;
SET @P_id = 100;
CALL p_test2(@p_id);
SELECT @p_id AS c;
COMMIT;
即可
SET autocommit = 0;是使session不会被mycat在执行sql之后释放该mysql连接
注解和randomDataNode的作用是指定dataNode
SELECT @p_id AS c;是把结果作为查询语句返回