2012-12-05 28 views
1

我想通过从dbcp中的basicDatasource中包装的jdbc mysql驱动程序连接到mysql集群。Jdbc mysql loadbalancing

这里是我的豆配置:

<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仅用作故障转移。

我错过了一些让负载平衡选项正常工作?

回答

0

有很多事情你需要注意明显。

首先,您需要确保您永远不会指定负载均衡策略,不确定其来源,但它不起作用。其次,默认情况下,DBCP从只有一个连接开始,并根据极端需求创建其他连接。这意味着你将只有一个与只有一台MySQL主机被重复使用的连接(特别是如果你的交易量很小),并且所有的流量都集中在那里。您可以通过指定较大的初始池大小来实现这一点 - 这将创建到每个服务器的多个连接。我个人负载均衡3台服务器,并使用固定的36个连接池。只有这样,DBCP才会尽力在不同的MySQL主机上建立连接。如果您只指定3个连接,则有可能连接将负载平衡到单个主机,并且您仍然以不公平的分配结束。我的猜测是,如果他们修复roundRobin策略,这将工作得很好,但现在它不适用于我。

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