2016-09-30 28 views
0

weblogicサーバーにいくつかのアプリケーションを配備しました。私はアプリのネギ接続を有し、かつ一時的な解決策ではプールJDBCプールが中断されました。アプリケーションにリソースを割り当てることができません

にそれらを返さない、私は拡張する必要があると思います

2016-09-22 12:58:33,442 ERROR CommonService - ------- ERROR --------- java.sql.SQLException: Internal error: Cannot obtain XAConnection weblogic.common.resourcepool.ResourceDisabledException: Pool jdbc/*** is Suspended, cannot allocate resources to applications.. 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResourceInternal(ResourcePoolImpl.java:377) 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:342) 
     at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:329) 
     at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:417) 
     at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:324) 
     at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:94) 
     at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:63) 
     at weblogic.jdbc.jta.DataSource.getXAConnectionFromPool(DataSource.java:1677) 
     at weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1475) 
     at weblogic.jdbc.jta.DataSource.getConnection(DataSource.java:446) 
     at weblogic.jdbc.jta.DataSource.connect(DataSource.java:403) 
     at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:364) 
     at [my-package].ConnectionHandler.newDatabaseConnection(ConnectionHandler.java:37) 

:数日前、私はログを追跡し、エラーメッセージを見ました接続プール 私は、この問題を作り、いくつかの奇妙なコードの下にいることがわかりアプリどの研究してみてください:

public class ConnectionHandler 
{ 
    .. 
    public ConnectionHandler() 
    { 
    logger.trace("ConnectionHandler() constructor called"); 
    } 

    static Connection newDatabaseConnection() throws SQLException 
    { 
    Connection conn; 
    try { 
     Context initContext = new InitialContext(); 
     DataSource dataSource = (DataSource) initContext.lookup(LOOKUP_URL); 
     conn = dataSource.getConnection(); 
     conn.setAutoCommit(false); 
    } catch (NamingException e) { 
     logger.error("------- ERROR ---------", e); 
     throw new ProcessingError("Could not obtain database connection!"); 
    } 
    return conn; 
    } 
} 

このアプリ(SOAPサービス)は、一度の要求を有す​​るデータを照会するには、以下のコードを使用します:

if (connectionHandler == null) { 
     connectionHandler = new ConnectionHandler(); 
    } 

    try { 
     conn = connectionHandler.newDatabaseConnection(); 

     // Some callable statements here  

     conn.commit(); 

     logger.info("------- OK ---------"); 

    } catch (SQLException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (InstantiationException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (IllegalAccessException e) { 
     logger.error("------- ERROR ---------", e); 
    } catch (DossierServiceException e) { 
     logger.error("------- ERROR ---------", e); 
    } finally { 
     jdbc.close(conn); 
    } 

私がまだ理解していない私の混乱:

  1. マルチスレッドで静的接続を使用しても問題ありませんか?

  2. リクエストごとに新しいクラス(ConnectionHandler)を作成し、静的接続を取得しますか?

  3. ResultSet、Callable文を閉じることなく接続を閉じるだけですか?

この問題の説明や、この問題を防ぐための解決策を教えてください。

答えて

1
  1. 結果は戻っていません。staticです。 static方法は、

  2. はい、それは間違いだが、ではなく、このような大した

  3. はい、それは閉鎖する最初の方が良いだろう呼び出すための外側のクラスのインスタンスを持っている必要はありませんことを意味し結果セット、ステートメントとの接続が、これは仕事をしなければならない

このコードの問題は何conn.rollback()catch内のブロックがありませんということで、バック

ロールされることはありませんキャッチされない実行時例外があるかもしれません
+0

こんにちは@Boris、 上記のコンテキストとデータソースについてはどうですか? 接続を取得したときに各スレッドを初期化してルックアップすればいいですか? またはシングルトンとしてリファクタリングする必要がありますか? あなたが知っているように、ConnectionHandlerは最初のリクエストから初期化され、Webサービスの存続期間中は生きています。 –

+0

手動で接続を割り当てる代わりに、JDBC接続プールを使用することをおすすめします。http://stackoverflow.com/a/2835570/32090 –

関連する問題