分布式应用中操作远程数据库的方式都有什么?目前我们生产使用的DBLink,但是每天不定时会报ORA-02068和 ORA-03135这两个错误,ORA-02068: following severe error from DB_LINK
ORA-03135: connection lost contact报错的堆栈信息可以看到是获取不到连接,类似下面的错误。getWeblogicPoolConnection(DBConn.java:255)现在需要解决这个问题,但是网络上很多网友都是遇到了这个问题,却没有一个具体的解决方案。我搜索了一天时间,但是没有比较好的解决办法。遇到这个问题的网友有很多。使用DBLink远程访问数据库本身就不是一个好办法嘛?DBLink有很多BUG?分布式应用连接DBLink的原理是什么?使用DBLink连接的远程应用不使用数据库连接池吗?

解决方案 »

  1.   

    有的网友说跟DBLink简历session的原理有关,需要释放Session。如:
    Alter session close database link DBLINKNAME
    但是在应用这这句话怎么添加呀,通过PL/Sql连接的话是没有错误的。
      

  2.   

    也有朋友说要设置 sqlnet.ora文件参数SQLNET.EXPIRE_TIME 的值,如
    SQLNET.EXPIRE_TIME =10
    但是使用了,这种办法无效
      

  3.   

    可能长时间连接网络异常断
    1.检查网络主机配置,防火墙,网关,路由器,交换机等
    2.大事物分割成多个小事务,减小事务,减少因为网络终止导致的异常
    3.SQLNET.EXPIRE_TIME =10  可以考虑
    4.可以使用其他方法来同步数据,不一定是dblink
      

  4.   

    dblink是数据库对象、允许你访问远程表及执行远程程序、dblink是单向连接、创建dblink时、oracle在数据字典记录其元数据.没有连接池、另外,数据同步,最佳实践应该是DG吧
      

  5.   

    我之前遇到了跟你一样的问题,现在已经解决了
    【现象】
    应用使用数据库连接池,访问A库时通过dblink查询B库,应用时不时会报错ORA-02068和ORA-0313。
    【过程还原】
    当应用获取了一个数据库连接,并在数据库连接中使用了dblink,如果应用到A库的连接不释放,则A库到B库的dblink 连接也不释放;当A库到B库的dblink连接由于长时间无数据被防火墙设备断开后,如果应用再次从连接池中获取这个连接,并要使用dblink查询时,则oracle就会报错。
    【根本原因】
    oracle替你保存了dblink连接,当你再使用时,没有检查就直接使用,则可能导致报错。
    【可行的解决方案】
    1. 升级oracle到11g,高版本oracle可以保证dblink使用时都是ok的;
    2. 应用访问数据库的代码中,查询完毕后,显示关闭dblink;
    3. 取消A库到B库的超时断开机制,这方法不保险,因为长时间的网络连接可能还会被其他因素断开;
    4. 配置应用连接池,每次提供连接时也要检查dblink是否可用。