JDBC支持数据库服务读写分离
达梦数据库有限公司
目录
JDBC支持数据库服务读写分离........................................................................................I
1 介绍 (1)
2 需求 (1)
2.1整体需求描述 (1)
2.2功能要求 (1)
2.3性能要求 (1)
3 系统总体结构设计 (1)
3.1异常处理流程....................................................................... 错误!未定义书签。
3.2D MDB C ONNECTION ................................................................... 错误!未定义书签。
3.3D MDB C 错误!未定义书签。
3.4语句句柄.............................................................................. 错误!未定义书签。
3.5CMD_PREPARE/CMD_EXECUTE ........................................... 错误!未定义书签。
3.6备机连接信息....................................................................... 错误!未定义书签。
4 接口定义 (6)
4.1用户接口 (6)
5 应用实例 (6)
5.1转换验证 (7)
5.2标准测试 (7)
1介绍
数据服务器主备(一主一备)环境支持事务读写分离操作,只读事务在备机上完成,其他在主机上完成,故要求JDBC能够根据指示在主备之间轮换工作,而不改变应用。
2需求
2.1整体需求描述
JDBC对外接口调用保持不变,读写分离环境下,能够主动在主备上进行转换操作。
2.2功能要求
增加读写分离连接属性rwSeparate,当取值1时,启动读写分离;取值0时,不启动;
启动读写分离时,主机和备机工作正常情况下,JDBC调用不变,完成以下功能:
1、与主机建立连接,获取备机信息,若存在备机,建立与备机连接;
2、在备机上执行事务,备机返回非只读事务,则转向主机执行;否则,一直在备机上执行;
3、主机事务结束,重新回到备机执行。
2.3性能要求
无
3系统总体结构设计
主动在主机和备机之间选择操作,实际上只是选择的socket和对应主机上的语句句柄ID不一样,其他消息内容都不需要改变。因此,只需要在内部维护两个socket 连接,每个语句句柄维护两个句柄ID,与socket连接分别对应。目前一个DbAccess对应Socket连接。
3.1DbAccess
将DbAccess的内部实现重新封装为DbPureAccess,作为DbAccess的成员,纯粹用来表示在某个socket上的访问。
DbAccess中维护两个DbPureAccess成员:
DbPureAccess m_accessPrimary;truncate读
DbPureAccess m_accessStandby;
分别表示与主机和备机的连接访问。调用流程如下:
⏹默认当前事务为只读,连接备机,调用m_accessStandby.access(),当发现需
要连接主机时,修改当前事务为非只读,替换与主机对应的句柄ID,然后调用m_accessPrimary.access();
⏹主机事务结束时,修改当前事务为只读,下次再连备机执行;
⏹若当前不存在备机,则强制调用m_accessPrimary.access()。
以上过程,封装在DbAccess中,大体实现如下:
DmMsgRecv access(DmMsgSend sendMsg, DmdbConnection_bs conn)
{
Int type = 0; // 0 连接备机,1 连接主机
If (!ansReadonly || !conn.hasStandby())
Type = 1;
DmMsgRecv msgRecv = null;
Boolean isSwitch = false;
While(true)
{
Switch(type)
{
Case 1:
msgRecv = m_accessPrimary.access();
break;
case 0:
msgRecv = m_accessStandby.access();
// 解析msgRecv,若需要在主机上执行,则:
/
/ type = 1;
// isSwitch = true;
Break;
}
If (!isSwitch)
Break;
}
3.2DmdbCSI
⏹connectToServer()
负责当前连接的CMD_STARTUP和CMD_LOGIN的执行。备机信息可在主机CMD_LOGIN的响应消息的尾部中获取。
⏹connectToStandby()
增加connectToStandby()函数,使用了备机的IP地址和端口号,完成备机连接DbAccess.m_accessStandby上的CMD_STARTUP和CMD_LOGIN。
3.3消息处理
⏹CMD_LOGIN
请求消息中增加字段REQ_GET_STANDBY,是否获取备机信息(0 不获取,1 获取);// 主机获取,备机不获取
响应消息增加字段RESP_STANDBY_IP、RESP_STANDBY_PORT 分别用于填充备机IP地址和端口号,若不需要获取备机信息或者无
备机信息,则不需要填充。
⏹CMD_EXECUTE/CMD_PREPARE
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论