<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>
<channel>
	<title>Comments on: Amoeba for Mysql</title>
	<atom:link href="http://amoeba.meidusa.com/wordpress/?page_id=4&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://amoeba.meidusa.com/wordpress</link>
	<description>Keep Amoeba Simple And Stupid</description>
	<pubDate>Mon, 06 Sep 2010 07:55:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: wxyz</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=4#comment-7123</link>
		<dc:creator>wxyz</dc:creator>
		<pubDate>Wed, 11 Aug 2010 12:59:33 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7123</guid>
		<description>您好，我刚开始用amoeba，客户端第一次查询的时候取不到数据，刷新几次就正常了，过几分钟又这样。project.log里有下面的错误，请问这个是什么原因呢？

2010-08-11 20:55:09,489 INFO  server.MysqlClientAuthenticator - Accepting request: conn=com.meidusa.amoeba.mysql.net.MysqlClientConnection@192.168.1.211:22709,hashcode=1583634598
2010-08-11 20:55:09,489 DEBUG auth - authentication time:3   Id=/192.168.1.211
2010-08-11 20:55:09,491 ERROR handler.CommandMessageHandler - &lt;&gt;


2010-08-11 20:55:09,491 WARN  handler.CommandMessageHandler - session was killed!!
java.lang.Exception
        at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:643)
        at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:247)
        at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:292)
        at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:264)
        at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:212)
        at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:65)

--------------以下是回复内容-----------------
Session was killed 原因：
1、sql查询时间过长。导致amoeba中断超时的请求
2、客户端在请求过程中，amoeba需要改变客户端连接的一些环境，诸如select dbname等操作，如果db不存在，则也会发生类似问题
</description>
		<content:encoded><![CDATA[<p>您好，我刚开始用amoeba，客户端第一次查询的时候取不到数据，刷新几次就正常了，过几分钟又这样。project.log里有下面的错误，请问这个是什么原因呢？</p>
<p>2010-08-11 20:55:09,489 INFO  server.MysqlClientAuthenticator - Accepting request: conn=com.meidusa.amoeba.mysql.net.MysqlClientConnection@192.168.1.211:22709,hashcode=1583634598<br />
2010-08-11 20:55:09,489 DEBUG auth - authentication time:3   Id=/192.168.1.211<br />
2010-08-11 20:55:09,491 ERROR handler.CommandMessageHandler - &lt;&gt;</p>
<p>2010-08-11 20:55:09,491 WARN  handler.CommandMessageHandler - session was killed!!<br />
java.lang.Exception<br />
        at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:643)<br />
        at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:247)<br />
        at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:292)<br />
        at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:264)<br />
        at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:212)<br />
        at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:65)</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8211;以下是回复内容&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Session was killed 原因：<br />
1、sql查询时间过长。导致amoeba中断超时的请求<br />
2、客户端在请求过程中，amoeba需要改变客户端连接的一些环境，诸如select dbname等操作，如果db不存在，则也会发生类似问题</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: pure</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=4#comment-7119</link>
		<dc:creator>pure</dc:creator>
		<pubDate>Wed, 11 Aug 2010 02:43:06 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7119</guid>
		<description>陈老师好：
我们用了amoeba来从数据分表，用到了ibatis和dbcp，运行一段时间后会出现如下异常：
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

开始怀疑是dbcp的问题，但是另外一台同样的用法，但没有用amoeba就没有这样的问题，所以最终还是把问题锁定在amoeba上面，现在用1.2.1GA版的时候amoeba的日志会抛出下面的异常:

2010-08-11 10:30:48,035 INFO  server.MysqlClientAuthenticator - Accepting request: conn=com.meidusa.amoeba.mysql.net.MysqlClientConnection@127.0.0.1:50439,hashcode=16994425

2010-08-11 10:30:48,036 DEBUG auth - authentication time:7   Id=/127.0.0.1

2010-08-11 10:30:48,073 ERROR handler.CommandMessageHandler - &lt;&gt;



2010-08-11 10:30:48,074 WARN  handler.CommandMessageHandler - session was killed!!

java.lang.Exception

	at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:643)

	at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:247)

	at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:292)

	at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:264)

	at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:212)

	at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:65)

不清楚是不是哪里配置出问题了？ :razz:

-------------------以下是回复内容---------------------------
你的配置没有错，你需要看一下，有些sql是否耗时比较厉害？</description>
		<content:encoded><![CDATA[<p>陈老师好：<br />
我们用了amoeba来从数据分表，用到了ibatis和dbcp，运行一段时间后会出现如下异常：<br />
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object</p>
<p>开始怀疑是dbcp的问题，但是另外一台同样的用法，但没有用amoeba就没有这样的问题，所以最终还是把问题锁定在amoeba上面，现在用1.2.1GA版的时候amoeba的日志会抛出下面的异常:</p>
<p>2010-08-11 10:30:48,035 INFO  server.MysqlClientAuthenticator - Accepting request: conn=com.meidusa.amoeba.mysql.net.MysqlClientConnection@127.0.0.1:50439,hashcode=16994425</p>
<p>2010-08-11 10:30:48,036 DEBUG auth - authentication time:7   Id=/127.0.0.1</p>
<p>2010-08-11 10:30:48,073 ERROR handler.CommandMessageHandler - <></p>
<p>2010-08-11 10:30:48,074 WARN  handler.CommandMessageHandler - session was killed!!</p>
<p>java.lang.Exception</p>
<p>	at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:643)</p>
<p>	at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:247)</p>
<p>	at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:292)</p>
<p>	at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:264)</p>
<p>	at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:212)</p>
<p>	at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:65)</p>
<p>不清楚是不是哪里配置出问题了？ <img src='http://amoeba.meidusa.com/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':razz:' class='wp-smiley' /><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-以下是回复内容&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
你的配置没有错，你需要看一下，有些sql是否耗时比较厉害？</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: connor</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=4#comment-7046</link>
		<dc:creator>connor</dc:creator>
		<pubDate>Thu, 22 Jul 2010 01:41:07 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7046</guid>
		<description>陈先生:
    你好!
    如果需要amoeba区配某数据库中所有表的操作，是否必须将这个数据库中的所有表都在rule.xml中配置出来。如果不是，我应如何操作；如果是，那在这个数据库中有程序自定义新增表时怎么处理？

—————以下是回复内容———————
如果这些表的规则一样，那么就可以在一个规则中配置就可以了
tableRule 中的name可以是 schema.name([,schema.name])*-- 多个表可以用逗号分割 </description>
		<content:encoded><![CDATA[<p>陈先生:<br />
    你好!<br />
    如果需要amoeba区配某数据库中所有表的操作，是否必须将这个数据库中的所有表都在rule.xml中配置出来。如果不是，我应如何操作；如果是，那在这个数据库中有程序自定义新增表时怎么处理？</p>
<p>—————以下是回复内容———————<br />
如果这些表的规则一样，那么就可以在一个规则中配置就可以了<br />
tableRule 中的name可以是 schema.name([,schema.name])*&#8211; 多个表可以用逗号分割</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: sangreen</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=4#comment-7026</link>
		<dc:creator>sangreen</dc:creator>
		<pubDate>Mon, 12 Jul 2010 01:10:54 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7026</guid>
		<description>陈先生你好
我目前在IIS的web service里面设置webconfig的数据连接使用的是amoeba的地址和密码.但是web service在被调用的时一直报错 错误信息如下#42000can not use this command here!! 

异常详细信息: MySql.Data.MySqlClient.MySqlException: #42000can not use this command here!!

我使用的mysql的.net连接器.
我不知道是哪里配置有错误.
盼复,谢谢!

-----------以下是回复内容---------------------------
你好,可能有些mysql命令我这儿还没有实现,诸如通过非command命令行模式来跟服务器交互.
接下来将会增加这方面命令的支持.</description>
		<content:encoded><![CDATA[<p>陈先生你好<br />
我目前在IIS的web service里面设置webconfig的数据连接使用的是amoeba的地址和密码.但是web service在被调用的时一直报错 错误信息如下#42000can not use this command here!! </p>
<p>异常详细信息: MySql.Data.MySqlClient.MySqlException: #42000can not use this command here!!</p>
<p>我使用的mysql的.net连接器.<br />
我不知道是哪里配置有错误.<br />
盼复,谢谢!</p>
<p>&#8212;&#8212;&#8212;&#8211;以下是回复内容&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
你好,可能有些mysql命令我这儿还没有实现,诸如通过非command命令行模式来跟服务器交互.<br />
接下来将会增加这方面命令的支持.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: struct</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-7023</link>
		<dc:creator>struct</dc:creator>
		<pubDate>Mon, 05 Jul 2010 04:10:07 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7023</guid>
		<description>to yuqiannumber11：
通过amoeba尽量别查询大数据量的数据（比如返回10w以上的记录）</description>
		<content:encoded><![CDATA[<p>to yuqiannumber11：<br />
通过amoeba尽量别查询大数据量的数据（比如返回10w以上的记录）</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: yuqiannumber11</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-7019</link>
		<dc:creator>yuqiannumber11</dc:creator>
		<pubDate>Thu, 01 Jul 2010 09:26:30 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7019</guid>
		<description>您好，陈老师：
我想问一下amoeba的查询过程，它是将各个节点的数据汇总后一起返回给客户端；还是告诉客户端所查的数据在哪节点上，然后客户端连接到数据所在的节点上，进行查询？
如果是第一种情况，如果查询大规模的数据的话，是否出现带宽的瓶颈，查询速度会降低？</description>
		<content:encoded><![CDATA[<p>您好，陈老师：<br />
我想问一下amoeba的查询过程，它是将各个节点的数据汇总后一起返回给客户端；还是告诉客户端所查的数据在哪节点上，然后客户端连接到数据所在的节点上，进行查询？<br />
如果是第一种情况，如果查询大规模的数据的话，是否出现带宽的瓶颈，查询速度会降低？</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: yuqiannumber11</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-7015</link>
		<dc:creator>yuqiannumber11</dc:creator>
		<pubDate>Sat, 26 Jun 2010 14:02:20 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-7015</guid>
		<description>您好，陈老师：
    最近测试amoeba-mysql-1.2.0-GA，发现跨数据库做连接的话，所要查询结果不出现。
    如假设PC1上安mysql1，PC2上安mysql2，装有相同的数据库test和相同的表table1和table2，table1有字段id、name，table2有字段id、cno；在PC1上的table1表中字段id的数值为1、2，table2表中的字段id的数值为1、2、3；在PC2上table1表中字段id的数值为3、4，table2表中的字段id的数值为3、4。做连接select * from table1,table2 where table1.id=table2.id;发现结果中少了PC2中table1连接PC1中table2的数据。望解答。谢谢。

--------------------以下是回复内容-------------------
利用amoeba做切分的时候，需要规避类似你上面的语句出现，除非你非常了解这些表的数据切分规则，确保他们在相同条件下数据是在相同的机器上面。

</description>
		<content:encoded><![CDATA[<p>您好，陈老师：<br />
    最近测试amoeba-mysql-1.2.0-GA，发现跨数据库做连接的话，所要查询结果不出现。<br />
    如假设PC1上安mysql1，PC2上安mysql2，装有相同的数据库test和相同的表table1和table2，table1有字段id、name，table2有字段id、cno；在PC1上的table1表中字段id的数值为1、2，table2表中的字段id的数值为1、2、3；在PC2上table1表中字段id的数值为3、4，table2表中的字段id的数值为3、4。做连接select * from table1,table2 where table1.id=table2.id;发现结果中少了PC2中table1连接PC1中table2的数据。望解答。谢谢。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;以下是回复内容&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
利用amoeba做切分的时候，需要规避类似你上面的语句出现，除非你非常了解这些表的数据切分规则，确保他们在相同条件下数据是在相同的机器上面。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: deeplyloving</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-6996</link>
		<dc:creator>deeplyloving</dc:creator>
		<pubDate>Mon, 24 May 2010 09:19:27 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-6996</guid>
		<description>好希望能有事务支持</description>
		<content:encoded><![CDATA[<p>好希望能有事务支持</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: echo</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-6932</link>
		<dc:creator>echo</dc:creator>
		<pubDate>Thu, 06 May 2010 09:33:13 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-6932</guid>
		<description>陈老师，
    我也遇到跟titi 同学类似的问题，不管怎么配置，在数据分库的时候总是去读defaultpool。由于defaultpool中没有需要的库，所以一直报错。求解。。。
    请问，有没有一些节点的详细说明，或者关联关系的介绍呢

－－－－－－－以下是回复内容－－－－－－－－－－－
我们先略过如何配置dbServer，假设我们已经配置好了2个dbServer分别是:
dbServer1 -- 存放myDB.user的 user_id &lt;= 1000 的数据
dbServer2 -- 存放myDB.user的 user_id &gt; 1000 的数据

那如何设置规则：
比如规则如下:
&lt;code&gt;
&lt;tableRule name=&#34;user&#34; schema=&#34;myDB&#34; defaultPools=&#34;dbServer1,dbServer2&#34;&gt;&lt;br /&gt;
&lt;rule name=&#34;rule1&#34;&gt;&lt;br /&gt;
&lt;parameters&gt;USER_ID&lt;/parameters&gt;&lt;br /&gt;
&lt;expression&gt;&lt;![CDATA[ USER_ID &lt;= 1000]]&gt;&lt;/expression&gt;&lt;br /&gt;
&lt;defaultPools&gt;dbServer1&lt;/defaultPools&gt;&lt;br /&gt;
&lt;/rule&gt;&lt;br /&gt;
&lt;rule name=&#34;rule2&#34;&gt;&lt;br /&gt;
&lt;parameters&gt;USER_ID&lt;/parameters&gt;&lt;br /&gt;
&lt;expression&gt;&lt;![CDATA[ USER_ID &gt;1000]]&gt;&lt;/expression&gt;&lt;br /&gt;
&lt;defaultPools&gt;dbServer2&lt;/defaultPools&gt;&lt;br /&gt;
&lt;/rule&gt;&lt;br /&gt;
&lt;/tableRule&gt;
&lt;/code&gt;
上面的规则tableRule：表示一个表或者多个表的规则，这些表都具有相同的规则,比如我有很多个table（db1.message   db2.friend）并且他们规则都是一样的，
tableRule 中的name可以这样写"myDB.user,db1.message,db2.friend" 这儿的schema为默认，如果table前面没有带database名字，则用默认的myDB
&lt;code&gt;
&lt;tableRule name=&#34;myDB.user,db1.message,db2.friend&#34; schema=&#34;myDB&#34; defaultPools=&#34;dbServer1,dbServer2&#34;&gt;
&lt;/code&gt;

我们再看这样的一条sql:
&lt;code&gt; insert into myDB.user(user_id,name,age) values(333,'hello',108);&lt;/code&gt;
user表我们需要按照 user_id来进行水平切分，那么在所有sql中必须包含user_id，并且user_id必须有明确的值，否则amoeba将不知道 user_id的数据。

因此我们写这样的规则：
&lt;code&gt;
&lt;rule name=&#34;rule1&#34;&gt;&lt;br /&gt;
&lt;parameters&gt;USER_ID&lt;/parameters&gt;&lt;br /&gt;
&lt;expression&gt;&lt;![CDATA[ USER_ID &lt;= 1000]]&gt;&lt;/expression&gt;&lt;br /&gt;
&lt;defaultPools&gt;dbServer1&lt;/defaultPools&gt;&lt;br /&gt;
&lt;/rule&gt;
&lt;/code&gt;
上述的 parameters 中是参与规则切分表达式的 column名字，多个column按逗号分割
如果不包含parameters中设置的所有clolumns，则这条规则将不匹配。
再看我们的sql语句：
&lt;code&gt; insert into myDB.user(user_id,name,age) values(333,'hello',108);&lt;/code&gt;
1. 首先amoeba先解析这个sql语句，得出myDB.user 这个表.并且解析这个sql语句中myDB.user 的所有条件(user_id=333 , name='hello', age=108)
2. 看myDB.user是否有相应的tableRule配置，如果没有则采用amoeba.xml中的defaultPools
3. 如果有myDB.user的tableRule，遍历这个tableRule中的所有Rule，匹配的过程是：首先看parameters中所有 column，比如rule1中有parameters=USER_ID，那么sql中一定需要包含user_id=**这个条件，否则这个规则将不匹配。

4. 如果匹配了以后，再判断这个sql是读的还是写的，如果读则将sql发生到 rule.readPools中执行，否则rule.writePools，如果 rule.readPools，rule.writePools都没配置，则会发送到 rule.defaultPools,
如果所有的规则都不匹配则将发送到 （tableRule.readPools/tableRule.writePools/tableRule.defaultPools)

举个例子：
比如我要执行一条sql： select * from myDB.user where user_id = 1;
这条sql应该发送到 dbServer1上面执行

</description>
		<content:encoded><![CDATA[<p>陈老师，<br />
    我也遇到跟titi 同学类似的问题，不管怎么配置，在数据分库的时候总是去读defaultpool。由于defaultpool中没有需要的库，所以一直报错。求解。。。<br />
    请问，有没有一些节点的详细说明，或者关联关系的介绍呢</p>
<p>－－－－－－－以下是回复内容－－－－－－－－－－－<br />
我们先略过如何配置dbServer，假设我们已经配置好了2个dbServer分别是:<br />
dbServer1 &#8212; 存放myDB.user的 user_id < = 1000 的数据<br />
dbServer2 -- 存放myDB.user的 user_id > 1000 的数据</p>
<p>那如何设置规则：<br />
比如规则如下:<br />
<code><br />
&lt;tableRule name=&quot;user&quot; schema=&quot;myDB&quot; defaultPools=&quot;dbServer1,dbServer2&quot;&gt;<br />
&lt;rule name=&quot;rule1&quot;&gt;<br />
&lt;parameters&gt;USER_ID&lt;/parameters&gt;<br />
&lt;expression&gt;&lt;![CDATA[ USER_ID &lt;= 1000]]&gt;&lt;/expression&gt;<br />
&lt;defaultPools&gt;dbServer1&lt;/defaultPools&gt;<br />
&lt;/rule&gt;<br />
&lt;rule name=&quot;rule2&quot;&gt;<br />
&lt;parameters&gt;USER_ID&lt;/parameters&gt;<br />
&lt;expression&gt;&lt;![CDATA[ USER_ID &gt;1000]]&gt;&lt;/expression&gt;<br />
&lt;defaultPools&gt;dbServer2&lt;/defaultPools&gt;<br />
&lt;/rule&gt;<br />
&lt;/tableRule&gt;<br />
</code><br />
上面的规则tableRule：表示一个表或者多个表的规则，这些表都具有相同的规则,比如我有很多个table（db1.message   db2.friend）并且他们规则都是一样的，<br />
tableRule 中的name可以这样写&#8221;myDB.user,db1.message,db2.friend&#8221; 这儿的schema为默认，如果table前面没有带database名字，则用默认的myDB<br />
<code><br />
&lt;tableRule name=&quot;myDB.user,db1.message,db2.friend&quot; schema=&quot;myDB&quot; defaultPools=&quot;dbServer1,dbServer2&quot;&gt;<br />
</code></p>
<p>我们再看这样的一条sql:<br />
<code> insert into myDB.user(user_id,name,age) values(333,'hello',108);</code><br />
user表我们需要按照 user_id来进行水平切分，那么在所有sql中必须包含user_id，并且user_id必须有明确的值，否则amoeba将不知道 user_id的数据。</p>
<p>因此我们写这样的规则：<br />
<code><br />
&lt;rule name=&quot;rule1&quot;&gt;<br />
&lt;parameters&gt;USER_ID&lt;/parameters&gt;<br />
&lt;expression&gt;&lt;![CDATA[ USER_ID &lt;= 1000]]&gt;&lt;/expression&gt;<br />
&lt;defaultPools&gt;dbServer1&lt;/defaultPools&gt;<br />
&lt;/rule&gt;<br />
</code><br />
上述的 parameters 中是参与规则切分表达式的 column名字，多个column按逗号分割<br />
如果不包含parameters中设置的所有clolumns，则这条规则将不匹配。<br />
再看我们的sql语句：<br />
<code> insert into myDB.user(user_id,name,age) values(333,'hello',108);</code><br />
1. 首先amoeba先解析这个sql语句，得出myDB.user 这个表.并且解析这个sql语句中myDB.user 的所有条件(user_id=333 , name=&#8217;hello&#8217;, age=108)<br />
2. 看myDB.user是否有相应的tableRule配置，如果没有则采用amoeba.xml中的defaultPools<br />
3. 如果有myDB.user的tableRule，遍历这个tableRule中的所有Rule，匹配的过程是：首先看parameters中所有 column，比如rule1中有parameters=USER_ID，那么sql中一定需要包含user_id=**这个条件，否则这个规则将不匹配。</p>
<p>4. 如果匹配了以后，再判断这个sql是读的还是写的，如果读则将sql发生到 rule.readPools中执行，否则rule.writePools，如果 rule.readPools，rule.writePools都没配置，则会发送到 rule.defaultPools,<br />
如果所有的规则都不匹配则将发送到 （tableRule.readPools/tableRule.writePools/tableRule.defaultPools)</p>
<p>举个例子：<br />
比如我要执行一条sql： select * from myDB.user where user_id = 1;<br />
这条sql应该发送到 dbServer1上面执行</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: titi</title>
		<link>http://amoeba.meidusa.com/wordpress/?page_id=4&#038;cpage=3#comment-6919</link>
		<dc:creator>titi</dc:creator>
		<pubDate>Wed, 05 May 2010 07:00:10 +0000</pubDate>
		<guid isPermaLink="false">http://amoeba.meidusa.com/wordpress/?page_id=4#comment-6919</guid>
		<description>陈老师，我配置好了，也运行起来了。
  可是，它读数据库，总是从默认的server 里面读，另一个server从来都没读过。这是为什么呢？大概是哪个地方出问题了？ 还有,rule.xml, amoeba.xml 都有schema, 我是想知道 rule里的代表什么意思。
 谢谢你了！

－－－－－－以下是回复内容－－－－－－－－－－－－－－－
amoeba.xml里面的schema是初始化连接的时候默认连接的数据库

rule.xml里面的rule中的schema则是表示当前执行的sql是在哪个database下面，比如这样一个sql：
select * from myDB.testTable where id = 1;

这个时候rule中的schema应该是 myDB
这个sql也可以分成2步执行：
1、use myDB;
2、select * from testTable where id =1;
那么TableRule中只要schema=myDB 并且 name=testTable 将会执行这个rule

</description>
		<content:encoded><![CDATA[<p>陈老师，我配置好了，也运行起来了。<br />
  可是，它读数据库，总是从默认的server 里面读，另一个server从来都没读过。这是为什么呢？大概是哪个地方出问题了？ 还有,rule.xml, amoeba.xml 都有schema, 我是想知道 rule里的代表什么意思。<br />
 谢谢你了！</p>
<p>－－－－－－以下是回复内容－－－－－－－－－－－－－－－<br />
amoeba.xml里面的schema是初始化连接的时候默认连接的数据库</p>
<p>rule.xml里面的rule中的schema则是表示当前执行的sql是在哪个database下面，比如这样一个sql：<br />
select * from myDB.testTable where id = 1;</p>
<p>这个时候rule中的schema应该是 myDB<br />
这个sql也可以分成2步执行：<br />
1、use myDB;<br />
2、select * from testTable where id =1;<br />
那么TableRule中只要schema=myDB 并且 name=testTable 将会执行这个rule</p>
]]></content:encoded>
	</item>
</channel>
</rss>
