问题描述
要实现功能:存在一个主服务器A,一个备用服务器B当服务器A出现问题(包括断网之类),我的程序自动切换数据库B。1、当服务器出现问题时,程序重启,并重新连接备用服务器B2、当服务器出现问题时,程序弹出友情提示框“服务器重新连接中”,然后重连思路:切换数据库连接字符串。通过改变数据库连接字符串可行是可行,不过有个问题就是,当我断开服务器A的连接的时候,我的程序会因为cn.Open();打开服务器连接的时候,进入卡死状态,点击会出现未响应状态。请问各位大大,有什么好的建议没有?万分感谢!
解决方案
解决方案二:
打开服务器连接之前判断sqlconnection的连接状态不就可以了。
解决方案三:
引用1楼duanzi_peng的回复:
打开服务器连接之前判断sqlconnection的连接状态不就可以了。
有判断,我写在了CheckConnection里面。可是总感觉那个连接状态并不那么好用。而且,cn.State应该只是显示当前状态,就算我服务器没有连上,它也只是出入closed的状态,没有说明是能打开的
解决方案四:
再补充一下,本来是想写在catch里面的,但是,就算在catch里面,cn.Open()还是会卡死整个程序,约等10-20秒左右才能catch到,而且听说当遇到异常的时候,catch是消耗大量系统资源?
解决方案五:
privatestaticOracleConnectionCreateConnection(){OracleConnectionres=null;vareh=newManualResetEvent(false);ThreadPool.QueueUserWorkItem(h=>{varconn=newOracleConnection(cnStr1);conn.Open();res=conn;eh.Set();});ThreadPool.QueueUserWorkItem(h=>{varconn=newOracleConnection(cnStr2);conn.Open();res=conn;eh.Set();});eh.WaitOne();returnres;}
解决方案六:
引用4楼sp1234的回复:
你可以类似这样写代码:privatestaticOracleConnectionCreateConnection(){OracleConnectionres=null;vareh=newManualResetEvent(false);ThreadPool.QueueUserWorkItem(h=>{varconn=newOracleConnection(cnStr1);conn.Open();res=conn;eh.Set();});ThreadPool.QueueUserWorkItem(h=>{varconn=newOracleConnection(cnStr2);conn.Open();res=conn;eh.Set();});eh.WaitOne();returnres;}
想知道一下大概原理