2012-03-08 18 views
0

このコードを使用してデータベーステーブルからデータをフェッチします。何度もリロードされるとJSFページがフリーズする

public List<Dashboard> getDashboardList() throws SQLException { 

     if (ds == null) { 
      throw new SQLException("Can't get data source"); 
     } 

     //get database connection 
     Connection con = ds.getConnection(); 

     if (con == null) { 
      throw new SQLException("Can't get database connection"); 
     } 

     PreparedStatement ps = con.prepareStatement(
       "SELECT * from GLOBALSETTINGS"); 

     //get customer data from database 
     ResultSet result = ps.executeQuery(); 

     List<Dashboard> list = new ArrayList<Dashboard>(); 

     while (result.next()) { 
      Dashboard cust = new Dashboard(); 

      cust.setUser(result.getString("SessionTTL")); 
      cust.setPassword(result.getString("MAXACTIVEUSERS")); 


      //store all data into a List 
      list.add(cust); 
     } 

     return list; 
    } 

このコードは、glassfishサーバーにデプロイされたJSFページの一部です。問題は、JSFページを何度もリロードすると(約8回)、Webページがフリーズすることです。スレッドプールがいっぱいで、新しい接続のためのスペースがないと思われます。どのように問題を解決することができますか?クエリが終了したときに接続を閉じるか、別の方法がありますか?

お祈り申し上げますすべての

+0

データソースの設定方法を教えてください。最初はプールされていますか? –

+0

このコードは実際にjsfページの一部ですか(JSPを使用しているので)。それとも、裏打ち豆の一部ですか?後者の場合、Beanのスコープは何ですか? –

+0

私はプール構成のいくつかのスクリーンショットを作った:http://imageshack.us/g/827/screenshotbg.png/ –

答えて

3

まず:あなたが明示的にclose()メソッドを呼び出すことによって行われたときにはい、あなたの接続を閉じる必要があります。接続を閉じると、データベースリソースが解放されます。

更新:PreparedStatementclose())も閉じてください。 SQLExceptionsをメソッド内で処理し、スローしないことをお勧めします。例外が発生しても、ステートメントと接続が閉じられていることを確認する必要があるからです。このような

何か:

Connection connection = dataSource.getConnection(); 
try { 
    PreparedStatement statement = connection.prepareStatement(); 
    try { 
     // Work with the statement 
    catch (SQLException e) { 
     // Handle exceptions 
} catch (SQLException e { 
    // Handle exceptions 
    } finally { 
     statement.close(); 
    } 
} finally { 
    connection.close(); 
} 

さらに、あなたは、Beanのフィールドのgetterメソッドでデータベースを照会してはいけません。 Getterは、各リクエスト中に複数回呼び出すことができます。より洗練された方法は、コンストラクタでDashboardListを準備すること、またはBeanの@PostConstructを準備することです。

+0

正しく理解すると、publicリストの前に@PostConstructを配置する必要があります getDashboardList()throws SQLException {? –

+0

いいえ、 'getDashboardList()'はBeanフィールドのゲッターです。新しいメソッドを作成します。 @PostConstruc public void init() 'ここでDashboardListを埋めます。ゲッターは、塗りつぶされたリストのみを返します。 –

+0

このエラーが発生しました。ORA-00604:再帰SQLレベル1でエラーが発生しました。ORA-01000:最大オープン・カーソルを超えました。ORA-01000:最大オープン・カーソルを超えました。私はこの文との接続を閉じました - con.close(); –