amoeba与J2EE工程的对接

在命令行可以用得风生水起的amoeba,要实现放到J2EE工程中,该怎么配置呢?

需要修改jdbc driver。


使用mysql jdbc提供的负载均衡配置再解决amoeba服务器的单点问题

1. jdbc连接字附串中的loadbalance说明

load balance方式有两种负载均衡算法,一种是随机式的轮询算法,另一种是最短响应时间算法

例句: <driver-url>jdbc:mysql:loadbalance://127.0.0.1:8066,10.20.238.164:8066/test</driver-url>

如果两台amoeba都正常时,会将访问的压力分载到 127.0.0.1,10.20.238.164两个机器上,还可以加上roundRobinLoadBalance=true参数,使用roundRobin轮询算法,若是其中一台机器down掉以后,将会自动将不能访问的数据库服务器 踢除,如果还原后将继续进行压力分载。

2. jdbc连接字附串中的replication说明

当后端MYSQL服务器群是master-slave单向一主N从的同步复制机制时,再使用loadbalance方式就会有问题了,因为如果有insert、update等写操作改变了从机的数据就麻烦了,从机不会将变化复制到主机,因此这种情况下需要实现“主读写、从只读”的模式,为了达到这个目的可以使用replication方式,

如下所示:<driver-url>jdbc:mysql:replication://master,slave1,slave2,slave3/test</driver-url>

replication方式可以很安全的实现写操作只发送到主机执行,而从机只会接收到读操作。


之后我再次进行访问,发现amoeba命令行报错

amoeba异常日志显示如下:
java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191)
at com.meidusa.amoeba.net.poolable.GenericObjectPool.borrowObject(GenericObjectPool.java:381)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.startSession(CommandMessageHandler.java:629)
at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:123)
at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2.run(MysqlClientConnection.java:291)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)


很奇怪,就去找各种文档。发现amoeba官方文档上也没有与代码接口的说明。。还好,最后终于在博客中找到了解决方法。

这是由于各客户端访问数据库权限的问题(通过查看$AMOEBA_HOME/logs/root.log)。在各客户端添加访问权限即可,在mysql命令下执行
mysql>GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;


之后再次运行,成功啦~


对了,之前找到一篇amoeba与JPA的对接,先把链接放这,万一以后要用呢。

你可能感兴趣的:(amoeba与J2EE工程的对接)