BackGroud故事:
我观察到Sybase JDBC驱动程序(jconn3)正在Statement.ExecuteUpdate(sql).
上吞噬异常
SQL语句是一个Insert语句,它将行插入到表(这不是临时表)中,但是由于未知原因,Statement.ExecuteUpdate(sql)
仍返回0。
此问题是随机的,似乎并非每次都发生。
我的理解是,如果没有行被更新,Statement.ExecuteUpdate(sql)
将返回0。但是就插入语句而言,我不确定为什么什么也没插入就不会引发异常。
由于该代码是旧代码(正在使用JDK 1.4),并且由于某些限制,我无法更改或更新JDBC驱动程序。
可能的:
我正从一个角度考虑驱动程序在Statement,PreparedStatement和CallableStatement方面是否具有ExecuteUpdate的不同内部实现,那么我可以建议将Statement更改为CallableStatement以调用ExecuteUpdate。
我想知道Sybase JDBC驱动程序中Statement,PreparedStatement和CallableStatement的ExecuteUpdate实现是否可能不同。
最佳答案
我很想知道Sybase JDBC驱动程序中Statement,PreparedStatement和CallableStatement的ExecuteUpdate实现是否可能不同。
在任何JDBC驱动程序中,.executeUpdate
和Statement
对象的PreparedStatement
实现都会有所不同,因为这两个对象的工作方式不同。Statement
对象只是执行任意SQL语句的对象。使用Connection#createStatement
创建对象时不提供SQL语句,而是将其作为参数传递给Statement#executeUpdate
方法。
创建PreparedStatement
对象需要在调用Connection#prepareStatement
方法时提供SQL语句。 SQL语句是“预编译的”,并作为对象的一部分进行缓存。是时候执行语句了,我们只需要调用PreparedStatement#executeUpdate
方法(不带参数),因为SQL代码已经“准备好了”。
由于必须为Statement#executeUpdate
提供一个参数,并且必须为PreparedStatement#executeUpdate
提供一个参数,因此显然必须以不同的方式实现。