如何检测当前连接的数据库不再可用(动态检测)
_ConnectionPtr连接SQL数据库,但当数据库停止或网络不可用时,程序怎么能 "马上 "知道这个事件的发生?
我的想法是在OnTimer中不断尝试连接,一旦连接失败,进行响应处理,但实际上即使数据库不再可用,连接也不会失败,因为检测频率为1S,而连接超时(_ConnectionPtr::put_ConnectionTimeout应该是这个吧)即使设的很小,实际上也要等至少5s,不知道为什么,这样还没检测到服务器失败,下一个Timer就到了,结果什么都检测不出来,如果检测频率为5s以上就可以检测到,但太久了..
放到线程里结果还是一样,可能是我对线程的理解还不太对,部分代码贴上:
UINT SubSubTH ( LPVOID pParam )
{
CMainFrame * pWnd = ( CMainFrame * ) pParam ;
_ConnectionPtr cn ;
cn.CreateInstance ( _T ( "ADODB.Connection ") ) ;// 测试连接
cn-> put_ConnectionTimeout ( long ( 1 ) ) ;
try
{
try {cn-> Close ();}catch(_com_error ){}
cn-> Open ( g_szConn.AllocSysString () , " " , " " , adModeUnknown ) ;
int i = cn-> State ;
CString sz ;
sz.Format ( "%d " , i ) ;
//pWnd-> MessageBox ( sz ) ;
if ( cn-> State != adStateOpen )
{
//pWnd-> MessageBox ( "B " ) ;
return 0 ;
}
}
catch ( _com_error e )
{
pWnd-> MessageBox ( "A " ) ;
}
//cn-> Release () ;
//pWnd-> MessageBox ( "EEE " ) ;
return 0 ;
}
UINT SubThread ( LPVOID pParam )
{
while ( 1 )
{
AfxBeginThread ( SubSubTH , pParam ) ;
::Sleep ( 1000 ) ;
}
return 0 ;
}
主程序启动SubThread线程,再每秒启动一个子线程,检测服务器状态,和OnTimer一样,::Sleep只有在超过5s才能检测到,难道在子线程等待连接超时的时候另开的一个子线程会对他产生影响,不知道..
其实最讨厌的问题就是put_ConnectionTimeout设置在5s一下根本不起作用,因为我只是测试已经连接上的服务器是否down掉,所以连接超时感觉几十ms就够了,如上问题如何解决,等高手来
PS:帖子每天+10分,直到100分
[解决办法]
可以用socket connect 1433(也可能是数据库的其他端口),这个检测可以设置超时时间来判断,比_ConnectionPtr要适时一些
[解决办法]
我也遇到这个问题了,不知道如何判断数据库的连接是否正常,当数据库服务停止或重启过了的时候,原先的连接已经失效了,我用State是否为adStateOpen判断,但是不行。郁闷ing