这可能是一个愚蠢或奇怪的问题,但我在应用程序中面临一个奇怪的错误已经持续了好几周,并且不知道如何解决它。
有一些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();
}