我的生产设置是两个运行Tomcat 7.0的物理服务器和两个运行MySQL 5.6的物理服务器。 MySQL服务器处于主/副本配置中。创建两个数据库连接池(一个用于主服务器,一个用于副本)并在适当的时候在应用程序级别选择性地选择它们并不是什么大问题。
我不会假装这不是一个带有许多微妙之处的复杂话题 - 让我试着把它分解为两个基本问题。
在一般情况下,我是否只想写入主副本而只能从副本中读取?
由于复制延迟不可预测,如果我在写入后需要立即读取,我可以从主设备读取吗?
先谢谢 -Hal50000
答案 0 :(得分:0)
经过一番研究,我回到了已经在MySQL Connector / J中实现的解决方案。对context.xml文件的资源中的driverClassName
和url
进行了相当简单的更改,如:
<Resource name="jdbc/my_db"
auth="Container"
type="javax.sql.DataSource"
username="db_user"
password="db_password"
driverClassName="com.mysql.jdbc.ReplicationDriver"
url="jdbc:mysql:replication://192.168.100.51:3306,192.168.100.52:3306/my_schema"
maxActive="200"
maxIdle="100"
maxWait="20000"
initialSize="20"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
/>
效果很好。 url的顺序是master / replica / replica / ...无论你拥有多少个副本。然后,您可以将Connection实例设置为setReadOnly(true)以从其中一个副本读取,或将setReadOnly(false)设置为从主服务器读取。显然,副本之间的负载平衡由驱动程序处理,但由于只有一个副本,我无法确认。
所有文档中都有更好的描述: https://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-replication-connection.html