IJ000453 - Unable to get managed connection

3433 ワード

年が明けたばかりで、本格的な出勤の初日にトラブルに遭遇しました...
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());

現在のセッションのデータベース接続を使用して、テストに合格しました.
  • Hibernate 3.6.10
  • Spring 3.2.8

  • DAOはHibernateDaoSupportを継承しており、この方法は推奨されていない....