我必须使用自定义的jdbc连接池库来连接mysql数据库。
问题是我的插入没有在数据库中持久化。。。为了缩小问题范围,我提取了插入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 db时,上面的代码不起作用。不工作,我的意思是没有错误,插入只是丢失。。。
当我在本地mysql数据库上执行相同的代码时,版本是:8.0.11,托管在windows机器上,它正在工作。。。
如果我改变连接,从
Connection conn = ds1.getPooledConnection("usr", "pwd").getConnection();
收件人:
Connection conn = ds1.getConnection();
它也开始在版本为8.0.11-commercial的远程mysql数据库上工作。。。
基础连接的自动提交模式已为true。。。
我试图实现一个定制的log4j记录器,希望看到一些跟踪,但也没有帮助:
ds1.setLogger("com.ibtech.mysqlproblem.Log4jLogger");
我的自定义连接池库使用池连接,所以我需要让上面的代码正常工作。在客户机中,我使用mysql-connector-java-8.0.11.jar。
非常感谢您的帮助。。。
5条答案
按热度按时间monwx1rj1#
------编辑:bug已创建
m1m5dgzv2#
服务器中的全局自动提交值为0时出现问题。发出更改用户命令,清除会话数据,自动提交设置丢失。
一个解决方案是在获得连接后再次设置autocommit标志。。。
感谢菲利佩对问题的分析。。
https://forums.mysql.com/read.php?39,666702666986#味精-666986
a7qyws3x3#
原来这是jdbc驱动程序中的一个bug。一个bug被归档了。。。
https://bugs.mysql.com/bug.php?id=91351
nfs0ujit4#
这似乎完全无关,但设置偏执属性为真似乎解决了我的问题。。。
p1iqtdky5#
------编辑:了解根本原因