Я должен использовать настраиваемую библиотеку пула соединений 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);
}
Вышеприведенный код НЕ работает, когда я подключаюсь к удаленному mysql db с версией: 8.0.11-commercial. Не работая, я имею в виду, что ошибки нет, вставка просто потеряна...
Когда я выполняю тот же код с моей локальной mysql db с версией: 8.0.11, размещенной на машине Windows, он работает...
Если я изменил соединение, получая код от
Connection conn = ds1.getPooledConnection("usr", "pwd").getConnection();
чтобы:
Connection conn = ds1.getConnection();
он также начинает работать с удаленными mysql db с версией: 8.0.11-commercial...
Режим autocommit базового соединения уже прав...
Я попытался реализовать собственный log4j logger с надеждой увидеть какой-то след, но это тоже не помогло:
ds1.setLogger("com.ibtech.mysqlproblem.Log4jLogger");
В моей собственной библиотеке объединения пулов используется объединенное соединение, поэтому мне нужно, чтобы приведенный выше код работал. В клиенте я использую mysql-connector-java-8.0.11.jar.
Любая помощь приветствуется...
Кажется совершенно несвязанным, но установка параноидального свойства на истину, казалось, решила мою проблему...
----------------Edit: причина корня understood---------------------------------------
Проблема возникает, когда глобальное значение autocommit равно 0 на сервере. Выдача команды пользователя изменения, очистка данных сеанса и настройка автозапуска теряются.
Обходным решением является установка флажка autocommit еще раз после получения соединения...
Спасибо Филипе за анализ проблемы.
https://forums.mysql.com/read.php?39,666702,666986#msg-666986
----------------Edit: ошибка created--------------------------------------
Оказалось, что это ошибка в драйвере JDBC. Ошибка была подана...
java.sql.DataSource
не должно влиять на логику приложения.