使c3p0表现得像Hibernate内置连接池

时间:2014-03-31 07:02:45

标签: java hibernate c3p0

这可能是一个愚蠢或奇怪的问题,但我在应用程序中面临一个奇怪的错误已经持续了好几周,并且不知道如何解决它。

有一些Quartz作业会定期更新数据库(更改订单和内容的状态)。只有Hibernate 3.1.3没有spring,所有事务都在代码中手动处理,并在finally块中显式调用session.close()。

这一切都与Hibernate内置连接池完美配合,但是在我将内置连接池更改为c3p0池之后,出现了一些与数据库事务/会话管理相关的错误。日志文件中没有例外或任何内容,因此很难说出究竟是什么原因。

有没有办法让c3p0连接池的行为类似于内置池?我只需要一个c3p0功能 - 检查死连接。在实现此池之前,存在空闲的SQL连接重置问题。为了保持连接存活,我决定使用c3p0池而不是内置。

这是我当前的c3p0配置:

c3p0.min_size=0
c3p0.max_size=100
c3p0.max_statements=0
c3p0.idle_test_period=600
c3p0.testConnectionOnCheckout=true
c3p0.preferredTestQuery=select 1 from dual
c3p0.autoCommitOnClose=true
c3p0.checkoutTimeout=120000
c3p0.acquireIncrement=2
c3p0.privilegeSpawnedThreads=true
c3p0.numHelperThreads=8

提前致谢。

c3p0是旧版本:0.9.0.4,因为我有Java 1.4环境。

以下是代码管理事务的粗略示例:

SessionFactory  sessionFactory  = null;
Context         ctx             = null;
Object          obj             = null;

ctx             = new InitialContext();
obj             = ctx.lookup("HibernateSessionFactory");
sessionFactory  = (SessionFactory) obj;
session         = sessionFactory.openSession();

Transaction tx = null;

try {
    tx = session.beginTransaction();

    // some transactional code

    if (!tx.wasRolledBack() && !tx.wasCommitted()) {
        tx.commit();
    }
} catch (Exception ex) {
    if (tx != null && !tx.wasRolledBack() && !tx.wasCommitted()) {
        // if it is runtime exception then rollback
        if (ex instanceof RuntimeException) {
            logger.log(Level.ERROR, "10001", ex);
                try {
                    tx.rollback();
                } catch (RuntimeException rtex) {
                    logger.log(Level.ERROR, "10002", rtex);
                }   
    }
    else {
         // attempt to commit if there are any other exceptions
         try {
             tx.commit();
         } catch (RuntimeException rtex) {
             logger.log(Level.ERROR, "10004", rtex);

             // if commit fails then try to rollback
             try {
                 tx.rollback();
             } catch (RuntimeException rtex2) {
                 logger.log(Level.ERROR, "10002", rtex2);
             }
                 // then rethrow this exception
                 throw rtex;
         }
    }
}
finally {
    session.close();
}

0 个答案:

没有答案