2

アプリケーションでDB プール ( DB プール) を使用しています。私のDAOコードは次のようなものです:

static {
        try {
            PropertyUtil propertyUtil = new PropertyUtil();
            propertyUtil.getBundle(Constants.DB_PROPERTIES);
            String dburl = propertyUtil.getProperty("dburl");
            String dbuserName = propertyUtil.getProperty("dbuserName");
            String dbpassword = propertyUtil.getProperty("dbpassword");
            String dbclass = propertyUtil.getProperty("dbclass");
            String dbpoolName = propertyUtil.getProperty("dbpoolName");
            int dbminPool = Integer.parseInt(propertyUtil
                    .getProperty("dbminPool"));
            int dbmaxPool = Integer.parseInt(propertyUtil
                    .getProperty("dbmaxPool"));
            int dbmaxSize = Integer.parseInt(propertyUtil
                    .getProperty("dbmaxSize"));
            Class.forName(dbclass).newInstance();
            moPool = new ConnectionPool(dbpoolName, dbminPool, dbmaxPool,
                    dbmaxSize, dburl, dbuserName, dbpassword);
            moLogWrapper.info("Connection pool size: -"+Integer.valueOf(moPool.getSize()));
        } catch (ApplicationException aoAppEx) {
            moLogWrapper
                    .error(aoAppEx.getMessage(), aoAppEx.fillInStackTrace());
            new ApplicationException(aoAppEx.getMessage(),
                    aoAppEx.fillInStackTrace());
        } catch (IllegalAccessException aoIllEx) {
            moLogWrapper
                    .error(aoIllEx.getMessage(), aoIllEx.fillInStackTrace());
            new ApplicationException(aoIllEx.getMessage(),
                    aoIllEx.fillInStackTrace());
        } catch (ClassNotFoundException aoCnfEx) {
            moLogWrapper
                    .error(aoCnfEx.getMessage(), aoCnfEx.fillInStackTrace());
            new ApplicationException(aoCnfEx.getMessage(),
                    aoCnfEx.fillInStackTrace());
        } catch (InstantiationException aoIEx) {
            moLogWrapper.error(aoIEx.getMessage(), aoIEx.fillInStackTrace());
            new ApplicationException(aoIEx.getMessage(),
                    aoIEx.fillInStackTrace());
        }

    }

私のopenConnection()メソッドは次のとおりです。

public void openConnection() throws ApplicationException {
        moLogWrapper.info("inside openConnection method");
        try {
            loCon = moPool.getConnection();
            // moLogWrapper.info(moPool.getSize());
        } catch (SQLException aoSqlEx) {
            moLogWrapper
                    .error(aoSqlEx.getMessage(), aoSqlEx.fillInStackTrace());
            if (null != loCon) {
                loCon = null;
            }
                throw new ApplicationException(1002, aoSqlEx);
        } catch (Exception aoEx) {
            moLogWrapper.error(aoEx.fillInStackTrace());
            throw new ApplicationException(aoEx.getMessage(),
                    aoEx.fillInStackTrace());
        }
        moLogWrapper.info("exiting openConnection method");
    }

問題は、接続プール クラスから .openConnection メソッドで null を取得していることです。ログにも DEBUG ログが出力されており、次の行が出力されます。

[snaq.db.ConnectionPool.sp] sp: Checkout - 10/10 (HitRate=40.186916%) - null returned

null が返される理由と、実際の問題をデバッグする方法を理解できません。

編集:

私のアプリケーションは正常に動作しますが、スローが突然このエラーをスローし始めます。

データベースとして postgres を使用しています。

4

1 に答える 1

0

javax.sql.DataSource接続を取得するために使用しないでください。

import javax.sql.DataSource;

public class JdbcConnection {

private static DataSource dataSource;

static{
   //make DB connection here with datasource
}

public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}

}
于 2012-11-20T07:28:07.817 に答える