代码之家  ›  专栏  ›  技术社区  ›  Pleymor

hibernate和c3p0 PooledConnection在数据库重新启动后不续订连接

  •  0
  • Pleymor  · 技术社区  · 7 年前

    我正在将hibernate与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的方式有什么问题吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Pleymor    7 年前

    好的,这不是因为c3P或休眠。

    错误的bean不是由Spring管理的,因此它显式地创建了一个新的c3p0 DataSource 初始化时,未使用通用c3p0 数据来源 .

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

    为了完成这个故事,我通过重新初始化专用c3p0解决了我的问题 数据来源 在bean中,如果引发异常。