我实现了一个 Java 应用程序,它使用以下查询根据给定的 id 集查询数据库:
select * from STUDENT where ID in (?)
该组 id 将用于替换?
。但是,有时我会收到异常:
Caused by: java.sql.SQLException: Numeric Overflow
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:4319)
at oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:187)
at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:712)
at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:434)
经过一些测试,我意识到如果我将 ids 列表分成许多较小大小的子列表,异常就会停止发生。由于某些原因,jdbc 不喜欢放入太多值IN (?)
。我想知道是否有人以前见过这个问题并对此有解释?由于此问题在生产环境中从未发生,而仅在本地环境(资源较弱)上发生,我怀疑这与服务器的资源有关。
Thanks
更新:我正在使用的源代码是:
// create a query
private String getQueryString(int numOfParams) {
StringBuilder out = new StringBuilder();
out.append("select * from STUDENT where ID in (");
for (int i = 0; i < numOfParams; i++) {
if (i == numOfParams - 1) {
out.append("?");
} else {
out.append("?, ");
}
}
out.append(")");
}
// set parameters
private void setParams(PreparedStatement ps, Set<String> params) {
int index = 1;
for (String param: params) {
ps.setString(index++, param);
}
}
public void queryStudent(Connection conn, Set<String> ids) throws Exception {
String query = this.getQueryString(ids.size());
PreparedStatement ps = conn.prepareStatement(query);
this.setParams(ps, ids);
ps.executeQuery();
// do some operations with the result
}
该问题是由 GlassFish 和应用程序之间的 jdbc 驱动程序冲突引起的。为了修复它,我需要:
- 更新应用程序的 pom.xml (因为我使用的是 Maven)以使用最新的
ojdbc 即 ojdbc6-11.2.0.3
- 将 ojdbc6-11.2.0.3 添加到 GlassFish 库
- 如有必要,请从 glassfish 中已部署的应用程序的库中手动删除 ojdbc jar(显然取消部署不会清除它)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)