2009-09-25 145 views
1

我們正在運行一個帶有oracle數據庫的websphere商業網站,並面臨着我們用完數據庫連接的問題。 我們使用JDBCHelper單例獲取準備好的語句並找出連接。無法關閉JDBC資源!

public static JDBCHelper getJDBCHelper() { 

       if (theObject == null){     
        theObject = new JDBCHelper(); 
       } 

     return theObject; 
} 
public void closeResources(Connection con, PreparedStatement pstmt, ResultSet rs){ 

     try{ 
      if(rs!=null){ rs.close();} 
     }catch(SQLException e){ 
      logger.info("Exception closing the resultset"); 
     }try{ 
      if(pstmt!=null) { pstmt.close(); } 
     }catch(SQLException e){ 
      logger.info("Exception closing the preparedstatement"); 
     }try{ 
      if(con!=null){ con.close(); } 

     }catch(SQLException e){ 
      logger.info("Exception closing the connection"); 
     } 
} 

然而,當我們試圖讓使用prepStmt.getConnection()傳遞到接近資源執行後的連接,它拋出一個SQL例外。任何想法爲什麼?執行後立即關閉連接嗎?我們使用單例JDBCHelper有什麼不對嗎?

編輯

部分,這使得準備好的語句,執行和關閉連接

PreparedStatement pstmt = jdbcHelper.getPreparedStatement(query); 
try{ 
//rest of the code 
int brs = pstmt.executeUpdate(); 
} 

finally{ 
      try { 
       jdbcHelper.closeResources(pstmt.getConnection(),pstmt); 
      } catch (SQLException e1) { 
       logger.logp(Level.SEVERE,CLASS_NAME,methodName,"In the finally block - Could not close connection", e1); 
      } 
     } 
代碼

回答

1

您的連接將最有可能來自一個游泳池,並關閉它實際上將返回到連接游泳池(在封面下)。我認爲發佈獲取連接的代碼,使用它並通過JDBCHelper關閉它會更有用。

Re。你的單身人士,我不知道你爲什麼使用這個,因爲它似乎沒有任何東西,它是一個單身人士。退房Apache Commons DbUtils這是做這種東西,除此之外。

+0

謝謝...已經更新了一部分代碼...雖然看起來很直截了當 – sarego 2009-09-25 09:09:17

0

此代碼似乎只是爲單線程操作編寫的,因爲它缺少任何同步代碼。例如,getJdbcHelper()方法可能會創建兩個JdbcHelper。如果我沒有弄錯,甚至不能保證第二個線程會在主線程創建它之後很長時間看到該對象。儘管它們通常會依靠JVM運行的體系結構。

如果你在網絡服務器中運行這個服務,你可能會遇到種族問題,其中兩個線程同時修改你的連接。除非你推出了自己的連接池或其他東西。

Brian是對的,使用免費提供的一個庫來解決這個(困難)問題。