HikariCP忽略连接超时,而不是从从DB读取

时间:2015-09-22 09:46:35

标签: java mysql hibernate hikaricp

我已经使用hibernate配置了hibernate-hikaricp 4.3.10的数据库连接。
我有简单的测试,从db读取一些值。我期待,当我切断与主服务器的连接时,hikari将检测它并向从服务器发送查询,但它只是挂起未定义的长。没有尝试询问slave db和mySQLExceptions,从我可以得出结论hikari / mysql-driver忽略我的超时和主从复制的设置。你能说,出了什么问题吗?

我的hibernate cfg.file

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <property name="hibernate.connection.provider_class">com.zaxxer.hikari.hibernate.HikariConnectionProvider</property>
        <property name="hibernate.hikari.dataSourceClassName">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</property>
        <property name="hibernate.hikari.dataSource.url">jdbc:mysql:replication://master:3306, slave:3306/models?loadBalanceBlacklistTimeout=5000&amp;loadBalanceConnectionGroup=cgroup&amp;loadBalanceEnableJMX=true&amp;autoReconnect=true&amp;autoReconnectForPools=true</property>
        <property name="hibernate.hikari.dataSource.user">user</property>
        <property name="hibernate.hikari.dataSource.password">password</property>
        <property name="hibernate.hikari.dataSource.cachePrepStmts">true</property>
        <property name="hibernate.hikari.dataSource.prepStmtCacheSize">250</property>
        <property name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit">2048</property>
        <property name="hibernate.hikari.connectionTestQuery">show tables</property>
        <property name="hibernate.hikari.idleTimeout">10000</property>
        <property name="hibernate.hikari.maximumPoolSize">10</property>
        <property name="hibernate.hikari.minimumIdle">5</property>
        <property name="hibernate.hikari.autoCommit">false</property>
        <property name="hibernate.hikari.readOnly">true</property>
        <property name="hibernate.hikari.connectionTimeout">10000</property>



        <!-- List of class mapping  -->
        <mapping class="my.pack.csamodels.entities.MyModel"/>


    </session-factory>
</hibernate-configuration>

和我的简单测试

    @Test
public void testDbAcess() {
    SessionFactory factory = new Configuration().configure("accounts_hib.cfg.xml").buildSessionFactory();
    Session session = factory.openSession();
    session.setDefaultReadOnly(true);
    try {
        SQLQuery query = session.createSQLQuery("SELECT id FROM accounts LIMIT 5");
        List results = query.list();
        assertTrue(!results.isEmpty());
    } finally {
        session.close();
    }
}

UPD


当我的查询挂起

时,我可以在日志中看到hikari守护进程
  21:44:23.648 [Hikari Housekeeping Timer (pool HikariPool-0)] DEBUG HikariPool - Before cleanup pool stats HikariPool-0 (total=0, inUse=0, avail=0, waiting=0)
  21:44:23.648 [Hikari Housekeeping Timer (pool HikariPool-0)] DEBUG HikariPool - After cleanup pool stats HikariPool-0 (total=0, inUse=0, avail=0, waiting=0)
  21:44:53.648 [Hikari Housekeeping Timer (pool HikariPool-0)] DEBUG HikariPool - Before cleanup pool stats HikariPool-0 (total=0, inUse=0, avail=0, waiting=0)

1 个答案:

答案 0 :(得分:0)

首先,在这种情况下,您不应该使用MysqlDataSource。您需要通过网址找到配置驱动程序,这基本上意味着将hibernate.hikari.dataSource.url更改为hibernate.hikari.jdbcUrl。您还可能需要直接指定复制驱动程序类hibernate.hikari.driverClassName=com.mysql.jdbc.ReplicationDriver

其次,show tables是一个可怕的测试查询(昂贵)。无论如何,您都不需要使用MySQL的测试查询,因为它支持JDBC4 isValid() API。

最后,readOnly真的想要你吗?此应用程序仅运行查询,从不插入/更新/删除数据?如果是这样,那很好,否则看起来很奇怪。

编辑:停止使用autoReconnectautoReconnectForPools,它们可能会阻止故障转移。此外,如果您正在使用主数据库,则需要将allowMasterDownConnections设置为true。请参阅this MySQL bug