如何重用JDBC语句和自动关闭结果集?

时间:2017-07-05 09:30:09

标签: java mysql jdbc

我正在处理一个项目,该项目将有许多语句连接到数据库 我想重用语句而不是每次连接都创建一个新语句 并且最重要的是我不想在使用后关闭每个结果集

我希望在重用之前关闭语句上的结果集

我的代码看起来像这样

ArrayList<Statement> BackStatements = new ArrayList();
int lastStatementIndex = 0;

private Statement GetStatement() throws SQLException {
    Statement SM;
    int MaxStatements = 5;
    if (BackStatements.size() < MaxStatements) {
        SM = Connection.createStatement();
        BackStatements.add(SM);
        lastStatementIndex = BackStatements.size() - 1;
    } else {
        lastStatementIndex = lastStatementIndex + 1;
        if (lastStatementIndex == MaxStatements) {
            lastStatementIndex = 0;
        }
        SM = BackStatements.get(lastStatementIndex);
     /// i want to close resultset generated by SM now and i do this before return this SM
        SM.getResultSet().close();

    }

    System.out.println("Last Index:" + lastStatementIndex + "---- Size:" + BackStatements.size());
    return SM;
}

但此方法通过logger

返回此错误
Caused by: java.sql.SQLException: ResultSet already requested

3 个答案:

答案 0 :(得分:1)

一般来说,这是个坏主意。 Statement是一个接口,实际的类可以是任何JDBC驱动程序返回的。 通常,您不能将一个语句类重用于另一个类型。例如, CallableStatement和PreparedStatement(对于oracle JDBC)是不兼容的。

对于ResultSet,关闭它会释放数据库游标,至少在某些情况下是这样。推迟使用resultSet.close()会对数据库服务器容量产生负面影响。

通常,如果您的JDBC驱动程序支持连接池,那么就可以了。通常,网络往返比创建语句更昂贵。

答案 1 :(得分:0)

这对我来说看起来很糟糕。

强制关闭时,无法确保最旧的Statement(和ResultSet)不再使用。

你没有提示Exeption发生的地方,但我认为这可能是原因。

如果您想使用语句池,那么您应该在使用后主动回复它。

答案 2 :(得分:0)

您应该使用驱动程序提供的语句缓存,而不是构建自己的语句缓存。例如,在Oracle JDBC瘦驱动程序中,有一个隐式语句缓存,它将负责优化语句和游标的分配和释放方式。它需要打开。该文档是here。要启用它,只需设置属性&#34; oracle.jdbc.implicitStatementCacheSize &#34;例如&#34; 10 &#34;这通常是语句缓存的一个很好的大小。