通过设置参数failOverReadOnly=false 可以防止故障转移连接处于只读模式。也可以使用com.mysql.jdbc.ReplicationDriver 或通过设置jdbc:mysql:replication://<your url...> 之类的url 告诉你的jdbc 连接url 选择内部驱动程序
在具有两个mysql数据库实例(端口3306和3307)的测试环境中,我使用了以下jdbc连接url:
jdbc:mysql:replication://address=(type=master)(protocol=tcp)(host=localhost)(port=3306),address=(type=master)(protocol=tcp)(host=localhost)(port=3307)/test?autoReconnect=true&connectTimeout=50&failOverReadOnly=false&allowMasterDownConnections=true" />
更多参数见Properties for Connector/J。
配置使用负载平衡主机。如果第一个 master 宕机,第二个 master 将处理所有流量,直到第一个 master 再次出现(反之亦然)。我不是数据库专家,但我不建议将这种配置用于生产用途,因为我猜您的应用程序的事务不知道数据库的内部复制状态。
您真正需要的是一个没有负载平衡主节点的解决方案。这可以使用连接池来完成。我使用了org.apache.commons.dbcp2.BasicDataSource 的内置功能,但它有一个缺点:池只创建一次,并且仅在第一个主服务器关闭之前可用。第二个主人不会有游泳池。也许这种行为可能会受到用自己的逻辑扩展 BasicDataSource 的影响,我还没有完全测试过。
我的建议是在您完成维护后重新启动您的应用程序(这会创建一个新的连接池)。在维护期间,由于基于请求而不是从池中提取连接,您的应用程序可能会变慢,但您不会有任何应用程序停机时间(..如果您的应用程序是集群的)。
代码如下:
<beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(type=master),address=(protocol=tcp)(host=localhost)(port=3307)(type=master)/test?autoReconnect=true&connectTimeout=5&failOverReadOnly=false&allowMasterDownConnections=true" />
<beans:property name="username" value="myDBUser" />
<beans:property name="password" value="myPassword" />
<beans:property name="initialSize" value="10"/>
</beans:bean>
注意没有使用ReplicationDriver,BasicDataSource 处理故障转移。
迈克尔