尽管使用c3p0,“无法打开连接”问题

时间:2017-11-20 10:12:34

标签: java hibernate c3p0

我已经在我的Spring Boot Application中使用c3p0连接池几个月了。一直很好,直到大约两周前我开始遇到连接问题,特别是在早上。每天早上当我尝试登录我的应用程序时,都会抛出Could not open connection错误。然后我会重新启动我的应用程序以解决问题。我无法找出问题的根本原因。

这是我的hibernate.cfg.xml:

hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb?autoReconnect=true</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">abc123</property>
    <property name="hibernate.dialect">config.CustomDialect</property>

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.initialPoolSize">5</property>
    <property name="hibernate.c3p0.minPoolSize">5</property>
    <property name="hibernate.c3p0.maxPoolSize">100</property>
    <property name="hibernate.c3p0.checkoutTimeout">3000</property>
    <property name="hibernate.c3p0.maxStatementsPerConnection">30</property>
    <property name="hibernate.c3p0.unreturnedConnectionTimeout">3000</property>
    <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">update</property>

...
POJO mappings
</session-factory>
</hibernate-configuration>

这是我的HibernateUtil类:

public class HibernateUtil {

private static final SessionFactory sessionFactory;
static {
    try {
        Configuration configuration = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(builder.build());

    } catch (Exception ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public Session openSession() {
    return sessionFactory.openSession();
}
}

我已将c3p0调试配置添加到我的应用程序中以剔除未返回的连接(如果发生内存泄漏)并为其生成堆栈跟踪但日志中没有显示任何内容。

这是今天早上的一些日志:

https://pastebin.com/MGb4Miau

这里的任何人都可以帮助我找出问题所在吗?

编辑CustomDialect上课:

public class CustomDialect extends MySQL5InnoDBDialect {
public String getTableTypeString() {
    return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
    }
}

1 个答案:

答案 0 :(得分:0)

出现此问题是因为您的数据库连接用完了。

  1. 持有连接的查询太慢。
  2. 您有很多不能满足最大池大小Array.prototype.find()的连接需求,这是自运行一天后出现问题以来的预期原因。
  3. 或者您有源泄漏,因为您在事务成功或失败后没有关闭连接。
  4.   

    从C3P0登录调试尝试查看请求的连接数。

    另外

    理想情况下,您不得在生产中使用100,因此您必须调试连接泄漏,并在不再有泄漏时删除 unreturnedConnectionTimeoutunreturnedConnectionTimeout配置。

    修改

    尝试这些配置:

    debugUnreturnedConnectionStackTraces

    因为有时Hibernate中的编码与MySQL db中的编码不同。