在程序中开了两个线程,都会调用下列代码连接oracle数据库,如果数据库连接失败,那么会每秒钟重新连接一次,可是在重连过程中,发现有时这两个线程调用DBConnection->Open()时会被阻塞,不再往下执行,也不返回;
而且在重连过程中,有时会返回错误“灾难性故障(0x8000ffff)”,之后一个循环再连接数据库时线程就会阻塞在同样的位置,而且CPU占用率是100%,这是为什么? ::CoInitialize(NULL);
_ConnectionPtr DBConnection; char bstrName[256];
sprintf(bstrName,"Provider=OraOLEDB.Oracle.1;Data Source=%s;User Id=%s;Password=%s;",
DataSource,UserID,Password);
try
{
//打开数据库:
HRESULT hr = DBConnection.CreateInstance(__uuidof(Connection)); if(SUCCEEDED(hr))
{ // DBConnection->put_ConnectionTimeout(long(5));
// DBConnection->put_CommandTimeout(long(5));
hr = DBConnection->Open(bstrName, "" ,"" , adConnectUnspecified/*adAsyncConnect*/); if(SUCCEEDED(hr))
{ }
else
{
}
}
else
{
}
}
catch(_com_error &e)
{
DWORD errorCode = e.Error(); //e.WCode();
str=e.ErrorMessage();
}
而且在重连过程中,有时会返回错误“灾难性故障(0x8000ffff)”,之后一个循环再连接数据库时线程就会阻塞在同样的位置,而且CPU占用率是100%,这是为什么? ::CoInitialize(NULL);
_ConnectionPtr DBConnection; char bstrName[256];
sprintf(bstrName,"Provider=OraOLEDB.Oracle.1;Data Source=%s;User Id=%s;Password=%s;",
DataSource,UserID,Password);
try
{
//打开数据库:
HRESULT hr = DBConnection.CreateInstance(__uuidof(Connection)); if(SUCCEEDED(hr))
{ // DBConnection->put_ConnectionTimeout(long(5));
// DBConnection->put_CommandTimeout(long(5));
hr = DBConnection->Open(bstrName, "" ,"" , adConnectUnspecified/*adAsyncConnect*/); if(SUCCEEDED(hr))
{ }
else
{
}
}
else
{
}
}
catch(_com_error &e)
{
DWORD errorCode = e.Error(); //e.WCode();
str=e.ErrorMessage();
}
解决方案 »
- MFC多线程与模式对话框
- 忘了怎么给ctreectrl插入图标了.
- vc/mfc Winsock聊天室程序中服务器接受消息顺序的问题
- 用visual stdio 2005编译directx9中总出现 'd3dx9.h': No such file or directory!!!
- 关于属性页的简单问题
- hicon 的问题 (在线~~~~~~~~~~)
- 我刚刚看完C++ primer,想学VC,那本书比较好呢?
- 如何在窗口没有焦点时也能显示tooltip
- 那有橡皮筋的应用例子,谢谢~~~~~~~~
- MFC如何实现Spin控件和Edit控件合用,实现Edit控件中数字的增减
- SetCapture与鼠标左键单击的问题
- 急求:VC++ 下的位图问题
最后要:
DBConnection->Close();
DBConnection = NULL;
CoUninitialize();
都试过了,但是没有用啊,还是不会返回;而且用 adAsyncConnect参数的话会报“runtime error”的错误
你可以在catch(_com_error &e)代码段中进行超时处理...