IJ000453 - Unable to get managed connection
3433 ワード
年が明けたばかりで、本格的な出勤の初日にトラブルに遭遇しました...
JBossエラーログ:
以上のエラーが発生したのは、次の方法です.
ビジネス・ログを保存する場合、変更前のビジネス・オブジェクトのステータスが必要になるため、
行コードを次のように変更してみます.
現在のセッションのデータベース接続を使用して、テストに合格しました. Hibernate 3.6.10 Spring 3.2.8
DAOは
JBossエラーログ:
Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/abc/ds/cba
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:390)
at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:139)
... 91 more
Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (30000 [ms])
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:383)
at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:397)
at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:365)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)
... 94 more
以上のエラーが発生したのは、次の方法です.
/**
* HQL List, STATELESS , Hibernate
* @param hql
* @param params
* @return
*/
public List getEntityListByHqlStateless(final String hql,final Map params) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
StatelessSession statelessSession = session.getSessionFactory().openStatelessSession();
Query query = statelessSession.createQuery(hql);
if (params != null) {
Iterator> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = iterator.next();
String key = entry.getKey();
Object value = entry.getValue();
if(value instanceof Collection) {
query.setParameterList(key, (Collection)value);
}else {
query.setParameter(key, value);
}
}
}
return query.list();
}
});
}
ビジネス・ログを保存する場合、変更前のビジネス・オブジェクトのステータスが必要になるため、
StatelessSession
を使用してHiberanteがエンティティ・オブジェクトのステータスを維持しないようにします.IJ000453, IJ000655
エラーは、データベース接続プールのconnection
が消費され、新しい接続が取得できないためです.session.getSessionFactory().openStatelessSession()
のこの方法の問題を疑って、まさか彼は毎回新しいデータベースの接続を取りに行きますか?しかも正常に釈放されていませんか?行コードを次のように変更してみます.
StatelessSession statelessSession = session.getSessionFactory().openStatelessSession(session.connection());
現在のセッションのデータベース接続を使用して、テストに合格しました.
DAOは
HibernateDaoSupport
を継承しており、この方法は推奨されていない....