hibernate 和 c3p0 PooledConnection 在数据库重启后不更新连接

hibernate and c3p0 PooledConnection don't renew connection after database reboot

我正在使用带 c3p0 的休眠模式,一旦重新启动数据库,应用程序就会因以下错误而中断:

[warn] [com.mchange.v2.c3p0.impl.NewPooledConnection] [c3p0] A PooledConnection that has already signalled a Connection error is still in use!
[warn] [com.mchange.v2.c3p0.impl.NewPooledConnection] [c3p0] Another error has occurred [ java.sql.SQLRecoverableException: Closed Connection ] which will not be reported to listeners!: java.sql.SQLRecoverableException: Closed Connection

TypedQuery.getSingleResult()

我必须重新启动应用程序才能修复它。

然而,EntityManager 是这样创建的单例 Bean:

LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(driverClassName);
cpds.setJdbcUrl(url);
cpds.setUser(user);
cpds.setPassword(password);
cpds.setPreferredTestQuery("SELECT 1 FROM dual");
cpds.setIdleConnectionTestPeriod(20);
cpds.setInitialPoolSize(0);
cpds.setMinPoolSize(0);
cpds.setMaxPoolSize(20);
cpds.setTestConnectionOnCheckin(true);

entityManagerFactory.setDataSource(cpds);

我不明白为什么在重启数据库后连接永远不会被池替换。

有人知道我使用 c3p0 的方式有问题吗?

好的,这不是因为 c3Pà 或 Hibernate。

报错的bean不是Spring管理的,所以在初始化时显式创建了一个新的c3p0DataSource,并没有使用普通的c3p0DataSource.

常见的 DataSource 在 JMX 中可见,但另一个不可见,我认为这意味着后者只是 不再存在 。使用公共 c3p0 DataSource 的控制器在数据库重新启动后仍然可以工作这一事实证实了这一点,并且错误仅由具有专用 DataSource.

的 bean 抛出

为了完成这个故事,如果抛出异常,我通过重新初始化 bean 中的专用 c3p0 DataSource 解决了我的问题。