2017-07-05 102 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」設置爲例如「」的值,該值通常對於語句高速緩存來說是一個很好的大小。