程序是个定时的程序,5分钟一次反复调用。
数据库在远程,连接字符串类似于“Data Source=AAA;user=AAA;password=AAA”
代码应该没啥问题
try
{
    using(OracleConnection conn = new OracleConnection(connStr))
    {
        conn.open();
        //里面就是简单的查询、更新语句,不写了        
    }
}
catch(Exception e)
{
}
运行一段时间后,程序就会在conn.open()那里或卡死,不返回,也不会抱错,不会进入catch。程序就一直等着,最长等过一天一夜,最后重启IIS好的。
1、首先查过数据库没有锁。
2、可能和连接池有关系,因为重启IIS,或者清空池,重新运行就可以了。
3、Oracle的连接不支持timeout属性,所以连接字符串里没设置。
4、连接池不想禁用,因为调用频繁,禁用后性能下降非常明显。
5、由于数据库在远程,网络不是太稳定,是有导致连接无效的可能,但不是不拋出异常的理由。
6、google搜了半天,有类似的问题,都是E文,而且没看到到底怎么解决的(除了说到禁用连接池).

解决方案 »

  1.   

    Oracle的连接不支持timeout属性,所以连接字符串里没设置。
    这个有什么其他办法吗?
      

  2.   

    没遇到过 应该不是程序问题 而是当IIS和 你所谓的定时引起的
    连接用完后没有归还,而且没有设置超时异常 导致程序一直等待获取连接尝试使用finally强制关闭连接
      

  3.   

                finally
                {
                    com.Dispose();
                    conn.Dispose();
                    conn.Close();//关闭打开的连接  
                }
      

  4.   

    你是否会在close时,发生异常,然后导致连接资源没有被释放,从而导致一段时间后,连接数得到了oracle设置的上限?所以建议你应该,用下面的方法,确保释放连接!
    try
    {
       conn.open()
       //执行数据操作  
    }
    catch(Exception)
    {
    }
    finally
    {
      try
        {
            conn.close();
         }
      catch(Exception)
      {
         if(conn!=null && conn.State=ConnectionState.Open)
             conn.close();
       }
    }
      

  5.   

    是不是有使用事物,如果事务开启后还未commit,你又在带事务的方法中使用新连接做了其他事,就会出这问题。 因为用连接创建事务后,事务未提交,连接也就一直未关闭(即使你用了using,连接也不会关闭,因为程序还未执行到此处),而新连接就会处于等待状态,如果连接不超时,程序不会出错也不会出结果。
    解决方案,事务commit后在做其它操作。
      

  6.   

    To computerfox:
    我用的是
    using(OracleConnection conn = new OracleConnection(connStr))
    {
      conn.open();
    }
    连接是会关闭的
      

  7.   

    To qixingchao:
    有事务的地方我都是用
    using(OracleConnection conn = new OracleConnection(connStr))
    {
      conn.open();
      using(OracleTransaction trans = conn.BeginTransaction())
      {
          //do something
          trans.commit();
      }
    }
    事务应该是会正常关闭,除非谁告诉我using的用法不对。
    而且事实上大部分时间运行是正常的,只在很特殊的情况下会出问题。现在不知道什么情况,怀疑是与oracle服务器之间连接有什么问题的时候,因为我调的是远程oracle,而且基本上后连接池有点关系。
      

  8.   

    事实上同样的程序用在了两个地方,连得库不一样。
    一个已经正常运行了2个礼拜,没有死过一次。另一个没有规律的死,有的时候1天,有的时候2、3天。
    部署环境也不用怀疑了,我曾经放在同一个机器上,由于有一个死了以后,影响iis才分开的。
      

  9.   


    using(OracleConnection conn = new OracleConnection(connStr))
    {
      conn.open();
      //do something
      conn.Close();
      //虽然conn会自动会被GC回收,最好还是按流程先conn.Close();  
    }
      

  10.   

    多數是你沒有CLOSE CONN
    以前有一次忘了關,也是老出錯就是找不到原因,重啟IIS就可以用一陣子.
      

  11.   

    using(OracleConnection conn = new OracleConnection(connStr))
    {
    }
    会自动生成dispose语句,dispose又会调用close语句的阿。
      

  12.   

    虽然conn会自动会被GC回收,最好还是按流程先conn.Close();  你知道异常是怎么产生的吗,偷懒偷的
      

  13.   

    经过不停的google,baidu,现在问题大概在这里:
    oci.ll的OCIStmtExecute,就是这个方法会卡死。我装的oci.dll的版本是10.2.0.1。
    现在关键是为什么会卡死,Oracle为什么设计成这个方法是卡死呢?我看到最新的版本是11.2.0.1,新的oci.dll是否修复了这个问题呢?11.2.0.1的客户端能和10.2.0.1服务器端一起用吗?
      

  14.   

    最后再顶一次,不行就结贴了。
    我现在用的微软提供的数据访问层.System.Data.OracleClient;是不是Oracle提供的ODP.Net考虑了这个问题呢?
      

  15.   

    我用ado连接oracle 做楼主类似的工作,多线程循环连接数据库,出现和楼主一样的问题。open时,卡死不返回,也不异常抛出