2017-07-05 60 views
0

上的项目,将有连接到DB 许多语句,我想重复使用报表,而不是创造新的每一个连接 ,而我不希望使用后关闭所有的ResultSet中最重要的事情IAM工作如何重用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; 
} 

但这种方法通过记录

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

看来你正试图在连接池中重用JDBC连接等语句。但是你的方法不适当地处理它。 ** Plz纠正我,如果我没有正确地得到你** –

+0

是的,你是正确的我想方法重用语句或一般想法做到这一点 – Abojemyeg

+0

但你没有分享你的代码**实际上是如何创建语句? * –

回答

0

这对我来说看起来很糟糕。当强制关闭它时,不能确保最早的Statement(和ResultSet)不再被使用。

你没有暗示那个Exeption发生,但我认为这可能是原因。

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

1

这是一般的坏主意。 Statement是一个接口,实际的类可以是JDBC驱动程序返回的任何东西。 一般而言,您不能将一个语句类重用为其他类型。例如, CallableStatement和PreparedStatement(对于JDBC JDBC)不兼容。

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

一般来说,如果您的JDBC驱动程序支持连接池,那就要走了。一般来说,网络往返比创建报表更费钱。

0

而不是建立自己的语句缓存,你应该使用驱动程序提供的。例如在Oracle JDBC瘦驱动程序中有一个隐式语句缓存,它将负责优化语句和游标的分配和释放方式。它需要打开。该文档是here。要启用它,只需将属性“oracle.jdbc.implicitStatementCacheSize”设置为例如“”的值,该值通常对于语句高速缓存来说是一个很好的大小。