Jdbc mysql负载均衡

时间:2012-12-05 16:07:01

标签: mysql jdbc

我正在尝试通过jdbc mysql驱动程序连接到mysql集群,该驱动程序包含在dbcp的basicDatasource中。

这是我的bean配置:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql:loadbalance://slave1:3306,slave2:3306/mobile_detection"/>
      <property name="username" value="username"/>
      <property name="password" value=""/>
      <property name="initialSize" value="10" />
      <property name="maxActive" value="100" />
      <property name="maxIdle" value="50" />
      <property name="minIdle" value="10" />
    </bean>

在我的mysql日志文件中,我看到两个服务器都在服务器启动时收到连接请求,但只有第一个slave1接收到READ查询。如果slave1关闭,则slave2仅用作故障转移。

我是否遗漏了一些东西以使loadbalance选项正常工作?

1 个答案:

答案 0 :(得分:0)

显然,您需要注意多种事项。

首先,你需要确保你从不指定负载均衡政策,不确定它来自何处,但它不起作用。

其次,默认情况下,DBCP仅以一个连接开始,并在极端需求下创建其他连接。这意味着您只有一个连接只与一个MySQL主机相关联,并且一直在重复使用(特别是如果您的交易很小)并且所有流量都集中在那里。您可以通过指定更大的初始池大小来实现此目的 - 这将创建到每个服务器的多个连接。我个人在3台服务器上进行负载均衡,并使用36个连接的固定池。只有这样,DBCP才会尝试与不同的MySQL主机相关联。如果您只指定3个连接,则有可能将连接负载平衡到单个主机,并且您仍然会得到不公平的分配。我的猜测是,如果他们修复了roundRobin政策,这将会运作得很好,但是现在它对我没用。

请记住,DBCP负载平衡池中的连接并且它们存在很长时间(或永久)。无论你最初得到什么作业,它都会保持这种状态。池不是动态负载平衡的好主意。 MySql J Connection用于添加新MySQL主机而不重新启动的JMX bean将无法正常工作。