MySQL JDBC 驱动程序无法将数据插入只读副本上的临时 table
MySQL JDBC driver not able to insert data into temporary table on read-replica
我正在连接到 MySQL 的只读副本实例(实际上,Google 云 SQL)。 JDBC 驱动程序似乎能够创建临时 table 但无法将数据插入其中。但是,使用另一个客户端(在我的例子中 MySQL workbench),我能够创建数据并将其插入临时 table。看起来像 JDBC 驱动程序中的错误?有哪些选项可以让它发挥作用?
这是我得到的异常(由于公司政策,我不能 post 整个堆栈跟踪):
Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2006)
版本详情:
MySQL版本=5.7.25-google-log
JDBC驱动=mysql-连接器-java-5.1.21.jar
注意:运行 主实例(而不是只读副本)将是我最后的选择。我几乎知道它会起作用。
不,驱动程序版本 99% 不是问题的原因(我猜)。因为我使用匹配的 JDBC 驱动程序版本在 MySQL 5.0、5.1、5.6 和 5.7 上成功写入临时 tables。
错误消息告诉我服务器本身由于其 "read only" 配置而拒绝尝试。
有一个相关的错误报告:https://bugs.mysql.com/bug.php?id=64992
您确定您 table 真的是一个临时的(不是常规的 table)并且您在同一个 session/connection 中使用它吗?因为否则它不会故意工作。
尝试使用最新版本的 JDBC 驱动程序 (v5.1.48),它成功了!所以我之前使用的 JDBC 驱动程序版本 (v5.1.21) 中存在错误。
我正在连接到 MySQL 的只读副本实例(实际上,Google 云 SQL)。 JDBC 驱动程序似乎能够创建临时 table 但无法将数据插入其中。但是,使用另一个客户端(在我的例子中 MySQL workbench),我能够创建数据并将其插入临时 table。看起来像 JDBC 驱动程序中的错误?有哪些选项可以让它发挥作用?
这是我得到的异常(由于公司政策,我不能 post 整个堆栈跟踪):
Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2006)
版本详情:
MySQL版本=5.7.25-google-log
JDBC驱动=mysql-连接器-java-5.1.21.jar
注意:运行 主实例(而不是只读副本)将是我最后的选择。我几乎知道它会起作用。
不,驱动程序版本 99% 不是问题的原因(我猜)。因为我使用匹配的 JDBC 驱动程序版本在 MySQL 5.0、5.1、5.6 和 5.7 上成功写入临时 tables。
错误消息告诉我服务器本身由于其 "read only" 配置而拒绝尝试。
有一个相关的错误报告:https://bugs.mysql.com/bug.php?id=64992
您确定您 table 真的是一个临时的(不是常规的 table)并且您在同一个 session/connection 中使用它吗?因为否则它不会故意工作。
尝试使用最新版本的 JDBC 驱动程序 (v5.1.48),它成功了!所以我之前使用的 JDBC 驱动程序版本 (v5.1.21) 中存在错误。