通过一段时间艰苦的奋斗,终于把sql server的读写分离搞定了。你们能够下载oneproxy-for-sqlserver来使用此功能。更多消息,能够访问平民软件官网获取。或者加入群 数据库监控 521095285,或者关注oneproxy-monitor框架项目(oneproxy-for-sqlserver是在此项目下开发的,会同步更新此框架)git
下面说说oneproxy-for-sqlserver读写分离的使用方法和开发中遇到的有趣问题。sql
为了支持读写分离,须要修改[oneproxy]标签的数据和增长[database_xxx]标签的数据以及数据库组的信息。详细以下所示:数据库
1) 在[oneproxy]标签下面增长:passwordseparate = true和readslave=true。增长后的配置以下所示:session
[oneproxy] logfile = oneproxy_log.log pidfile = oneproxy_pid.pid listen_addr = 0.0.0.0 listen_port = 9999,7777,6666 httpserver_addr = 0.0.0.0 httpserver_port = 8080 log_level = error data_dump = false log_sql = false clientusername = admin clientpassword = 0000 passwordseparate = true readSlave = true
须要注意的是:框架
1)若是不配置,默认状况下这两个选项也是为true。sqlserver
2)若是readSlave为true,则必须配置passwordseparate为true。spa
若是不想使用密码分离功能,则一样也不能使用读写分离功能。.net
2) 在数据库配置组标签[sqlserver_9999]下面增长主数据库和从数据库的信息,好比:code
[database_1433] host = 127.0.0.1 port = 1433 username = sa password = 0000 [database_1434] host = 127.0.0.1 port = 1434 username = sa password = 0000 [sqlserver_9999] dbmastergroup = database_1433 dbslavegroup = database_1434 classname = SSProtocol frontport = 0
须要注意点:server
1)数据库的信息必须放置在[database_xxx]标签下面。这个标签必须以database开头。
2)数据库组信息放到其余名称的标签(不能是[oneproxy]和[database_xxx]的标签)下,如上配置中的[sqlserver_9999]标签。
3)主数据库配置在dbmastergroup上,从数据库配置在dbslavegroup上。
4)容许不存在从数据库,若是没有从数据库,则读写分离的功能被禁止。
完成上面的配置后,直接启动程序便可。
1)事务中的操做所有在主数据库执行
2)非事务中的select语句在从数据库执行(无论是statement下的仍是preparedstatement下的)
在开发读写分离的过程当中,遇到不少问题。好比:
1) 当在同一个session中,从不一样数据库获得的spid可能不一样,则须要根据发送到不一样的数据库重写spid。
2) 怎么透明的处理游标和prepared句柄。
3) 在事务中怎么处理非事务中建立的statement或者preparedstatement.
4) 怎么处理在事务中建立的statement和preparedstatement在非事务中使用的问题。
5)怎么处理包中的事务描述符等数据。
在开发的过程当中,遇到因为没有重写事务描述符,致使一直提示不能新开始一个事务的异常。针对这个问题,我研究了很长时间,同时直连和读写分离的包数据的比较查找数据包的差别点,以及读MSDN文档等众多艰苦的过程。终于明白了处理方法。
2)平民软件官网.