我必须使用自定义的jdbc连接池库连接到mysql db。
问题是我的插入不会在db中持久化...为了缩小问题范围,我将插入到db中的库代码部分提取出来并有一些奇怪的发现:
MysqlConnectionPoolDataSource ds1 = new MysqlConnectionPoolDataSource();
ds1.setUser("usr");
ds1.setPassword("pwd");
ds1.setServerName("server");
ds1.setPort(port);
ds1.setDatabaseName("dbname");
ds1.setUseSSL(false);
ds1.setAllowPublicKeyRetrieval(true);
Connection conn = ds1.getPooledConnection("usr", "pwd").getConnection();
logger.info("connection " + conn.toString());
PreparedStatement ps = null;
ResultSet rs = null;
try {
String query = "INSERT INTO ...";
ps = conn.prepareStatement(query);
int timeout = 10;
ps.setQueryTimeout(timeout);
logger.info("timeout: " + timeout);
logger.info("Starting query execution for query: " + query);
long qeStart = System.currentTimeMillis();
ps.setString(1, "...");
ps.executeUpdate();
long qeEnd = System.currentTimeMillis();
logger.info("Query execution completed in " + (qeEnd - qeStart) + "msec.");
} catch (Exception e) {
logger.error("ERROR OCCURED", e);
System.err.println("ERROR OCCURED");
e.printStackTrace();
} finally {
closeResultSet(rs);
closeStatement(ps);
closeConnection(conn);
}
当我连接到版本为8.0.11-commercial的远程mysql数据库时,上面的代码不起作用。通过不工作我的意思是没有错误,插入只是丢失...
当我在Windows机器上托管版本:8.0.11的本地mysql数据库执行相同的代码时,它正在运行...
如果我从
更改连接获取代码Connection conn = ds1.getPooledConnection("usr", "pwd").getConnection();
为:
Connection conn = ds1.getConnection();
它也开始对远程mysql db工作,版本:8.0.11-commercial ...
底层连接的自动提交模式已经成立......
我试图实现一个自定义的log4j记录器,希望看到一些痕迹,但这也无济于事:
ds1.setLogger("com.ibtech.mysqlproblem.Log4jLogger");
我的自定义连接池库使用池化连接,因此我需要使上述代码正常工作。在客户端我使用的是mysql-connector-java-8.0.11.jar。
非常感谢任何帮助...
答案 0 :(得分:0)
似乎完全不相关但是将偏执属性设置为真似乎解决了我的问题......
----------------编辑:根本原因理解----------------------- ---------------- 强>
当服务器中的全局自动提交值为0时,会出现问题。发出更改用户命令,清除会话数据和自动提交设置将丢失。
解决方法是在获取连接后再次设置自动提交标志...
感谢Filipe分析问题..
https://forums.mysql.com/read.php?39,666702,666986#msg-666986
----------------编辑:错误创建------------------------ -------------- 强>
事实证明这是JDBC驱动程序中的一个错误。已经提交了一个错误......