【问题标题】:Datanucleus 2.x and MySQL Bug #13955027 (SET OPTION)Datanucleus 2.x 和 MySQL 错误 #13955027(设置选项)
【发布时间】:2014-01-10 08:18:36
【问题描述】:

在连接到 MySQL 5.6.5 或更高版本的服务器时调用某些方法可能会发生 MySQLSyntaxErrorException。受影响的方法包括 StatementImpl.execute() 和 PreparedStatement.execute()。原因是在 MySQL 服务器中删除了 SET OPTION 语法。这些方法被修改为在内部使用较新的 SET 语法。 (错误号 13955027)

使用 DN 2.1 版本,我得到了这个异常:

javax.jdo.JDODataStoreException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at line 1
    at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:319)
    at org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1654)
    at org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1667)

NestedThrowablesStackTrace: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1051)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3563)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3495)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2687)
at com.mysql.jdbc.StatementImpl.executeSimpleNonQuery(StatementImpl.java:1544)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1446)
at com.mysql.jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:3259)
at com.jolbox.bonecp.ConnectionHandle.getTransactionIsolation(ConnectionHandle.java:621)
at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:478)
at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getXAResource(ConnectionFactoryImpl.java:417)
at org.datanucleus.store.connection.ConnectionManagerImpl.enlistResource(ConnectionManagerImpl.java:361)
at org.datanucleus.store.connection.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:228)
at org.datanucleus.store.connection.AbstractConnectionFactory.getConnection(AbstractConnectionFactory.java:56)
at org.datanucleus.store.rdbms.ConnectionFactoryImpl.getConnection(ConnectionFactoryImpl.java:352)
at org.datanucleus.store.AbstractStoreManager.getConnection(AbstractStoreManager.java:312)
at org.datanucleus.store.rdbms.request.FetchRequest.execute(FetchRequest.java:290)
at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.fetchObject(RDBMSPersistenceHandler.java:319)
at org.datanucleus.jdo.state.JDOStateManagerImpl.loadFieldsFromDatastore(JDOStateManagerImpl.java:1928)
at org.datanucleus.jdo.state.JDOStateManagerImpl.validate(JDOStateManagerImpl.java:4414)
at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2785)
at org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1649)
at org.datanucleus.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1667)

有没有办法在不升级 DN 库的情况下避免这种情况?

【问题讨论】:

  • 您为什么不发布基本信息,例如在 DN 代码中使用“SET OPTION”的位置?毕竟你可能有一些错误和一些日志条目,它对应于代码中的某些行但没有显示它(一些堆栈跟踪的顶部没有显示任何有用的东西......下面是什么......嵌套...)
  • 我发布了嵌套跟踪。如果问题不在 JDBC 驱动程序中(使用解决该错误的最新版本),则只能在 datanucleus 或 boneCP 上。打算进一步调查。谢谢。
  • DN 调用 JDBC getConnection。然后调用 JDBC 驱动程序。这是唯一可以发出任何此类呼叫的事情。 QED
  • 你是对的。我更新了驱动程序我的团队没有使用最新的项目更新。问题不是 DN 也不是 BoneCP。问题出在 MySQL JDBC 驱动程序上。

标签: mysql exception syntax jdo datanucleus


【解决方案1】:

根据 cmets,解决方案是升级到 MySQL Connector/J 5.1.20 或更高版本,includes the fix:

调用某些方法时可能会发生 MySQLSyntaxErrorException 同时连接到 MySQL 5.6.5 或更高版本的服务器。受影响的方法 包括 StatementImpl.execute() 和 PreparedStatement.execute()。这 原因是在 MySQL 服务器中删除了 SET OPTION 语法。 这些方法被修改为在内部使用较新的 SET 语法。 (漏洞 #13955027)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多