MySQL 连接器问题

Posted

技术标签:

【中文标题】MySQL 连接器问题【英文标题】:MySQL connector issues 【发布时间】:2015-09-15 08:26:47 【问题描述】:

如果更改 mysql 连接器 Jar 版本,我会遇到某些错误。 我的代码在 JBoss 版本 4.0.4.GA 上运行良好。 然后我使用连接器 jar 版本 mysql-connector-java-5.1.36-bin 将 JBoss 升级到 Wildfly,并且没有对运行良好的代码进行任何更改。 现在,每当我添加一些新行时,我都会收到一条错误消息,指出未请求生成的密钥。

You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

之前我认为这可能是因为服务器(JBoss)升级问题。我开始在每个代码中添加Statement.RETURN_GENERATED_KEYSconnection.prepareStatement()。但后来我在阅读了这个线程Migration to Mysql Connector Jar 5.1.27 后意识到这不是 JBoss 升级问题,而是导致此错误的 mysql 连接器版本。 谁能指出我应该使用哪个版本的mysql连接器来阻止这些错误。因为在文件数量中添加Statement.RETURN_GENERATED_KEYS非常困难。

谢谢

【问题讨论】:

@a_horse_with_no_name 你能给我一些见解吗? 谁能告诉我应该在每个文件中添加Statement.RETURN_GENERATED_KEYS 还是有其他方法可以摆脱这个? 【参考方案1】:

注意:有几种方法可以告诉驱动程序返回生成的密钥

    Connection.prepareStatement(String sql, int autoGeneratedKeys) Connection.prepareStatement(String sql, int[] columnIndexes) Connection.prepareStatement(String sql, String[] columnNames) Statement.executeUpdate(String sql, int autoGeneratedKeys) Statement.executeUpdate(String sql, int[] columnIndexes) Statement.executeUpdate(String sql, String[] columnNames)

来自Connection.prepareStatement(String sql, int autoGeneratedKeys)的javadoc

创建一个默认的 PreparedStatement 对象,该对象能够检索自动生成的键。给定的常量告诉驱动程序是否应该使自动生成的密钥可用于检索。如果 SQL 语句不是 INSERT 语句或能够返回自动生成的键的 SQL 语句(此类语句的列表是特定于供应商的),则忽略此参数。

不幸的是,javadoc 不清楚当您致电 Connection.prepareStatement(String sql) 时会发生什么。

据我所知,传递Statement.RETURN_GENERATED_KEYS(或列名/索引)保证Statement.getGeneratedKeys() 将返回一个值。如果您没有明确请求,则无法保证 getGeneratedKeys() 会返回值。

简而言之,为了符合 JDBC 规范,如果您打算调用 Statement.getGeneratedKeys(),则应始终使用上述方法之一

【讨论】:

如果我打电话给Connection.prepareStatement(String sql),这算不算非法使用JDBC? 不,不是……而且 99% 的时间您都可以愉快地使用此方法。但是,如果您希望 Statement.getGeneratedKeys() 返回一个值,那么您应该(必须?)使用我上面提到的方法之一。 实际上的问题是我的代码在升级到 JBoss 之前运行良好。然后我只是将它升级到wildfly并使用驱动程序mysql-connector-java-5.1.36-bin它失败了这些错误。我的意思是问这是因为连接器驱动程序而发生的吗? 这不是 jboss 升级引起的,几乎 100% 肯定是驱动升级引起的。我认为在没有明确指定RETURN_GENERATED_KEYS 的情况下从getGeneratedKeys() 获得结果之前你很幸运,你永远不应该依赖这种无证行为。我觉得新的驱动程序版本通过抛出异常正在做正确的事情。修复代码并继续前进! 非常感谢兰斯。你把我的疑问说清楚了。它几乎吞噬了我的大脑,想知道出了什么问题,而没有触及单段代码它是如何引发异常的。但是你帮我把想法说得够清楚了。

以上是关于MySQL 连接器问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 连接器问题

mysql连接超时的问题

java连接mysql的问题

连接mysql的问题

Python 3.3 Mysql 连接器 [重复]

使用 ODBC 连接器的 VBA/MySQL 问题