求教oracle出现ORA-03135后程序不能重新连接数据库的问题!!!

FoxBryant 2012-02-02 08:06:01
各位大神:

我用OTL(开源的、用C++封装的操作数据库的类库)连接oracle数据库,并实时提交记录。程序用多个线程(最多5个)连接数据库。最近发现程序在运行一段时间(22个小时左右)后,出现假死的情况,所有的连接线程都在,但是连接线程好像在哪里卡住了,用VS附加上去也不能看到在哪里卡住了(因为连接线程已经卡住了,不能继续执行)。

查看程序日志,发现OTL捕获的异常信息是:ORA-03135:连接失去联系
查看oracle的alert日志,发现有以下错误:
Fatal NI connect error 12638, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGV0=oraclencsoft)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))'))(CONNECT_DATA=(SID=ncsoft)(CID=(PROGRAM=D:/oracle/product/10.2.0/db_2/bin/sqlplus.exe)(HOST=YEXY1)(USER=yexy1))))

VERSION INFORMATION:
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for 32-bit Windows: Version 10.2.0.1.0 - Production
Time: 07-7月 -2010 13:33:07
Tracing not turned on.
Tns error struct:
ns main err code: 12638
TNS-12638: 身份证明检索失败
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0

我尝试http://blog.csdn.net/yexianyi/article/details/5724267上面的解决方法及在服务器上设置SQLNET.EXPIRE_TIME=5,但是仍没有解决。

程序中连接的使用流程是(根据程序日志,怀疑在这个函数卡住了):提交记录时如果捕获到异常,则会尝试不停地重新连接数据库直到连接成功,以下是重新连接的代码:
void ReConnect(otl_connect &otlConnect, const char *pConnStr, int iAutoCommit)
{
if (1 == otlConnect.connected)
{
otlConnect.logoff();
}

Retry:
try
{
otlConnect.rlogon(pConnStr, iAutoCommit);
}
catch (otl_exception &e)
{
Sleep(1000);
goto Retry;
}
//保存重新连接成功的日志 //卡住时没有执行到这里
}

这个问题困扰我两天了,即便出现ORA-03135错误,连接relogon就可以了,为什么会卡住呢?求各位指点,非常感谢!
...全文
18910 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
scaleyuming 2014-01-10
  • 打赏
  • 举报
回复
哥们 你的问题解决了吗 我也碰到一个类似的问题
wjj305590 2013-07-18
  • 打赏
  • 举报
回复
有没可能是防火墙的问题?空闲连接被防火墙禁掉。我也遇到过这种现象,连接上oracle后,长时间没有访问oracle,后来需要访问的时候阻塞在访问oracle的接口上,后来加了个心跳,就没再出现了
lin_xx 2013-04-09
  • 打赏
  • 举报
回复
关注。。。linux不会出现此问题,windows却会。
sailing0123 2013-02-26
  • 打赏
  • 举报
回复
另外,最好别在某个中间层用死循环,要改变策略。 我建了一个连接池,目前的策略是如果执行SQL失败了,不重新连接再执行,而是等那下一次调用连接时,判断上一次的错误码,需要的话就重连。 下面是我收集的需要重连的错误码: ORA-03113: 通信通道的文件结尾 ORA-03114: 未连接到 ORACLE ORA-03135: 失去联系 ORA-12170: TNS: 连接超时 ORA-12541: TNS: 无监听程序(需要启动监听后再重新连接) ORA-12543:TNS: 无法到达目的主机 ORA-12545: TNS: 因目标主机和对象不存在,连接失败 Oracle错误太多了,欢迎补充啊!
sailing0123 2013-02-26
  • 打赏
  • 举报
回复
我也在用OTL,程序是跨平台(Linux/Windows),没有发现楼主的问题,建议把异常信息写到日志文件中,这样也好知道是什么错误。 我的重连函数跟你差不多:
/*****************************************************************
    Function    : CConnection::Reconnect
    Description : 重新连接数据库
    Input       : 
        @ bForce : 强制重练标识,如果为false则判断是否已经连接上,是则返回
    Output      : 无
    Return      : 
        成功    : true
        失败    : false
    ******************************************************************/
    bool CConnection::Reconnect(bool bForce /* = false */)
    {
        if( m_db.connected == 1 && !bForce )
            return true;

        try
        {
            m_db.logoff();
            m_db.rlogon(m_strConn.c_str());
        }
        catch( otl_exception & e )
        {
            GetErrFromException(e);
        }

        return ( m_db.connected == 1 ) ? true : false;
    }
slopover 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:
引用 5 楼 的回复:

求指点~


这位大哥,你的问题解决了吗》??
我的软件最近也是经常报ORA-03135的错误,每次都让线程卡死一样
我按照网上的方法将SQLNET.EXPIRE_TIME=20,都还是依旧
希望可以通过你那边获取到一些解决方法信息


这个问题我也跟OTL的作者联系了,我给了他一份测试代码,但是他在LINUX上测试的没有问……
[/Quote]

最近也碰到这个问题,请将otl作者的邮件转我看下,谢谢啦
hot5241@qq.com
FoxBryant 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

求指点~


这位大哥,你的问题解决了吗》??
我的软件最近也是经常报ORA-03135的错误,每次都让线程卡死一样
我按照网上的方法将SQLNET.EXPIRE_TIME=20,都还是依旧
希望可以通过你那边获取到一些解决方法信息
[/Quote]

这个问题我也跟OTL的作者联系了,我给了他一份测试代码,但是他在LINUX上测试的没有问题(我这边在Windows),他说应该是Windows下OCI的问题,但是根本原因也没有找到。你如果需要看他的回复,请留个邮箱,我转发给你。

我现在采取了一个不得已的方法:开启一个线程专门用于检查连接是否存活,若发现在指定时间内线程没有反应则重启程序。
「已注销」 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

求指点~
[/Quote]

这位大哥,你的问题解决了吗》??
我的软件最近也是经常报ORA-03135的错误,每次都让线程卡死一样
我按照网上的方法将SQLNET.EXPIRE_TIME=20,都还是依旧
希望可以通过你那边获取到一些解决方法信息
FoxBryant 2012-02-02
  • 打赏
  • 举报
回复
求指点~
我心飞翔 2012-02-02
  • 打赏
  • 举报
回复
提交记录,如果捕获到异常,为什么要不断的重新连接数据库,又不是连接的问题。
不断的relog,是不是超出了数据库连接上限了。
jdsnhan 2012-02-02
  • 打赏
  • 举报
回复
提交频率是多少。看一下log有没有对应的日志,看一下监听日志的大小

如果出现错误,如何解决,重启库?
FoxBryant 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luiseradl 的回复:]
提交记录,如果捕获到异常,为什么要不断的重新连接数据库,又不是连接的问题。
不断的relog,是不是超出了数据库连接上限了。
[/Quote]

谢谢这位大哥的回复!

在出错的机器上,用netstat -a | find "1521"查看连接,只有3个,是正常的。在数据库服务器上查看的结果是12个(有两台客户端在连此数据库)。

连接断开时提交异常的一个原因(如服务被停止或网络中断),这里直接重连算是偷懒了,应该有更好的方法,但是程序在重连前有做断开连接(logoff)的操作。


if (1 == otlConnect.connected)
{
otlConnect.logoff();
}

Retry:
...


FoxBryant 2012-02-02
  • 打赏
  • 举报
回复
谢谢楼上两位大哥的回复!

[Quote=引用 1 楼 jdsnhan 的回复:]
提交频率是多少。看一下log有没有对应的日志,看一下监听日志的大小

如果出现错误,如何解决,重启库?
[/Quote]

有记录的话,提交频率是100ms左右,如果当前没有记录,则不执行提交。
监听日志文件有234M。

出现错误时,在另外一台机器上运行程序可以正常连接;在出错的机器上重启程序也可以正常连接,不需要重启数据库。

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧