我开发了一个 Java Web 应用程序,使用 Hibernate 3.3.2 作为持久性框架,使用 Apache Tomcat 7.0.27 作为服务器。此应用程序已成功设置为使用 MySQL 5.5 Replication Server:1 个主服务器,1 个从属服务器。只读查询在后者上进行,其他在主实例上进行。
问题来了:我想测试数据库故障转移,即在某个时间停止从属 MySQL 实例,并查看应用程序在只读查询下仍然可以正常工作。据我从以下文章MySQL Failover with Connector/J中了解到,这应该可以在不更改代码的情况下实现。首先,我对第二种情况感兴趣:通信异常(以“08”开头的 SQL 状态)。不幸的是,这不会发生,如果我停止从服务器,有时需要很长时间才能从服务器获得响应,有时没有任何响应并且 HTTP 连接卡住了。在 Tomcat 日志中,只需获取以下行:
从服务器成功接收到的最后一个数据包是在 N 毫秒前。最后一个成功发送到服务器的数据包是 0 毫秒前。
这是休眠配置的片段:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.ReplicationDriver</property>
<property name="hibernate.connection.url">jdbc:mysql://masterIP,slaveIP/mydb?loadBalancePingTimeout=1500&loadBalanceBlacklistTimeout=7000&autoReconnect=true&failOverReadOnly=false&roundRobinLoadBalance=true</property>
在查看 MySQL 连接器文档时,我尝试了许多属性配置,但无法弄清楚如何获得可靠的故障转移。