gpt4 book ai didi

java - HikariCP 忽略连接超时,不从从数据库读取

转载 作者:行者123 更新时间:2023-11-29 03:29:03 31 4
gpt4 key购买 nike

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

我的 hibernate 配置文件

<?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)

最佳答案

首先,在这种情况下您不应该使用 MysqlDataSource。您需要通过 URL 找到配置驱动程序,这基本上意味着将 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 .

关于java - HikariCP 忽略连接超时,不从从数据库读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32713677/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com