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);
}
私がまだ理解していない私の混乱:
マルチスレッドで静的接続を使用しても問題ありませんか?
リクエストごとに新しいクラス(ConnectionHandler)を作成し、静的接続を取得しますか?
ResultSet、Callable文を閉じることなく接続を閉じるだけですか?
この問題の説明や、この問題を防ぐための解決策を教えてください。
こんにちは@Boris、 上記のコンテキストとデータソースについてはどうですか? 接続を取得したときに各スレッドを初期化してルックアップすればいいですか? またはシングルトンとしてリファクタリングする必要がありますか? あなたが知っているように、ConnectionHandlerは最初のリクエストから初期化され、Webサービスの存続期間中は生きています。 –
手動で接続を割り当てる代わりに、JDBC接続プールを使用することをおすすめします。http://stackoverflow.com/a/2835570/32090 –