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
解决了我的问题。
我正在使用带 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 中的专用 c3p0 DataSource
解决了我的问题。