CYQ.Data(V5)读写分离使用方法 (如何配置与对应的效果)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CYQ.Data(V5)读写分离使用方法 (如何配置与对应的效果)相关的知识,希望对你有一定的参考价值。
之前写过一篇关于CYQ.Data 关于读写分离的使用心得。但在测试时,出现过各种的意外表现,未能达到预期效果。然后经过"路过秋天"这几天的调优以后。各种使用环境均已达到预期效果。
今天在这里将如何配置,以及对应的配置在使用时的表现整理出来。分享给大家。大家可以在实际使用中对号入座(也欢迎大家自行测试)
一:主备从库结构一致时
1:配置和测试代码
<add name="Conn" connectionString="server=.;uid=sa;pwd=123456;database=Db;" providerName="System.Data.SqlClient"/>
<add name="Conn_Bak" connectionString="server=.;uid=sa;pwd=123456;database=Db_Bak;" providerName="System.Data.SqlClient"/>
<add name="Conn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=Db_Slave1;" providerName="System.Data.SqlClient"/>
<add name="Conn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=Db_Slave2;" providerName="System.Data.SqlClient"/>
//update
using (MAction action = new MAction("table"))
{
action.SetExpression("pid=‘" + id + "‘");
action.Update("id=1");
if (action.RecordsAffected == -2)
{
res = "update操作异常";
}
}
//Select
using (MAction action = new MAction("table"))
{
json = action.Select(1,1).ToJson(false,false);
}
2:测试条件和结果
2.1:当所有配置的数据库连接正常时
结果:update和select均操作主库(如果是只有select操作时,仅从2个从库上获取数据(Conn_Slave1,Conn_Slave2),且按序切换)
2.2:当主库Conn连接异常时
结果:update和select均操作备库(如果是只有select操作时,仅从2个从库上获取数据(Conn_Slave1,Conn_Slave2),且按序切换)
2.3:当主库Conn和备库Conn_Bak均连接异常时
结果:update操作失败,select从2个从库上获取数据,不抛出异常,但可使用action.RecordsAffected == -2判断update操作结果;(如果是只有select操作时,仅从2个从库上获取数据(Conn_Slave1,Conn_Slave2),且按序切换)
2.4:当主库Conn和备库Conn_Bak连接均异常,从库中任何一个连接异常时
结果:update操作失败,select从正常的从库上获取数据,不抛出异常,但可使用action.RecordsAffected == -2判断update操作结果;(如果是只有select操作时,仅从正常的从库上获取数据)
2.5:所有配置的数据库连接均异常时
结果:抛出异常;可使用try来捕捉,并按需返回结果
二:主从结构不一致(分库分表)
1:配置和测试代码
<add name="Conn" connectionString="server=.;uid=sa;pwd=123456;database=Db;" providerName="System.Data.SqlClient"/>
<add name="Conn_Bak" connectionString="server=.;uid=sa;pwd=123456;database=Db_Bak;" providerName="System.Data.SqlClient"/>
<add name="ReadConn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=Db_Read_Slave1;" providerName="System.Data.SqlClient"/>
<add name="ReadConn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=Db_Read_Slave2;" providerName="System.Data.SqlClient"/>
测试代码(1):无try
//update
using (MAction action = new MAction("table"))
{
action.SetExpression("pid=‘" + id + "‘");
action.Update("id=1");
if (action.RecordsAffected == -2)
{
res = "update操作异常";
}
}
//Select
using (MAction action = new MAction("table", "ReadConn"))
{
json = action.Select(1, 1).ToJson(false, false);
}
测试代码(2):try
try
{
//update
using (MAction action = new MAction("table"))
{
action.SetExpression("pid=‘" + id + "‘");
action.Update("id=1");
if (action.RecordsAffected == -2)
{
res = "update操作异常";
}
}
}
catch (Exception)
{
res = "主/备数据库均无法正常连接";
}
//Select
using (MAction action = new MAction("table", "ReadConn"))
{
json = action.Select(1, 1).ToJson(false, false);
}
2:测试条件和结果
2.1:当主或备(Conn/Conn_Bak)任何一个连接正常时
结果:update在主或备之间正常的数据库上进行操作,select从2个从库上获取数据(ReadConn_Slave1,ReadConn_Slave2),且按序切换
2.1:当主或备(Conn/Conn_Bak)均连接异常时
测试代码(1)结果:抛异常。因为在update时发生异常,后续的select无法正常执行
测试代码(2)结果:
初次执行时:异常被捕捉到,res="主/备数据库均无法正常连接";Select从2个从库上获取数据(ReadConn_Slave1,ReadConn_Slave2),且按序切换
刷新页面时:主/备数据库连接已被认定为无效连接,此时会被判定为无异常,但是内部的异常返回机制会使 res = "update操作异常" 成立;Select依然从2个从库上获取数据(ReadConn_Slave1,ReadConn_Slave2),且按序切换
在以上测试中。数据库之间的切换均非常流畅,无额外的响应等待时间
以上是关于CYQ.Data(V5)读写分离使用方法 (如何配置与对应的效果)的主要内容,如果未能解决你的问题,请参考以下文章
CYQ.Data V5 分布式缓存MemCached应用开发介绍