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_KEYS
到connection.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 连接器问题的主要内容,如果未能解决你的问题,请参考以下文章