2

我实现了一个 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)

经过一些测试,我意识到如果我将 id 列表划分为许多较小的子列表,则异常停止发生。出于某种原因,jdbc 不喜欢在IN (?). 我想知道是否有人以前见过这个问题并对此有解释?由于此问题从未在生产环境中发生,而仅在本地环境(资源较少)上发生,我怀疑它与服务器的资源有关。

谢谢

更新:我正在使用的源代码是:

// 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
}
4

3 回答 3

3

该问题是由 GlassFish 和应用程序之间的 ojdbc 驱动程序冲突引起的。为了修复它,我需要:

  • 更新应用程序的 pom.xml(因为我使用的是 maven)以使用最新的 ojdbc,即 ojdbc6-11.2.0.3
  • 将 ojdbc6-11.2.0.3 添加到 GlassFish 库
  • 如有必要,从 glassfish 中已部署的应用程序库中手动删除 ojdbc jar(显然这不会被取消部署清除)
于 2013-05-20T10:11:29.350 回答
0

您是否检查了 MySQL 和/或 JDBC最大数据包大小设置?这通常会用大量的 IN (...) 列表来咬你。

于 2013-05-15T16:09:22.947 回答
0

这发生在您的实体的 ID 属性或其他整数属性类型中,请查看您的堆栈跟踪>

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)

从查询返回的任何值都不适合此属性!更改属性 Integer 并尝试在实体的所有 Integer 类型字段中使用下一个整数类型(long、Long BigInteger)。

于 2013-10-18T13:12:03.380 回答