Oracle.ManagedDataAccess连接请求超时

时间:2014-09-01 06:56:53

标签: odp.net odp.net-managed

我遇到了与Oracle ManagedDataAccess.dll一起使用的线程代码问题。为了模拟这个问题,我创建了一个小型测试应用程序,用于打开连接,执行查询并关闭连接。

发生的事情是,当我运行此代码时,conn.open()语句中随机出现“连接请求超时”(ODP-1000)。现在我已经做了很多Googeling,它告诉我池的大小太小,但是这不是这里的情况,因为那时我会得到一个“池连接超时”异常(ODP-1012)。我也玩过连接字符串属性,并且在测试应用程序中,当我设置更大的“连接超时”属性时,我可以完美地进行战争,但重点是这对我的应用程序没有帮助我正在努力。

非常感谢任何帮助或见解!

 class Program  
    {  
        static readonly object _object = new object();  
        static string connectionstring = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=oralinux.contoso.com)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=DB)));User Id=system;Password=xxxxxx;Pooling=True;Min Pool Size=;Max Pool Size=20;Incr Pool Size=10;Decr Pool Size=1;Connection Lifetime=0;Connection Timeout=1;Self Tuning=false";  
        static string query = "select to_char(max(end_time),'Mon-DD-YYYY HH24:MI:SS') \"SPFILE\" from V$RMAN_STATUS where object_type='SPFILE' and status='COMPLETED'";  
        static void Main(string[] args)  
        {  
            for (int i = 0; i < 1000; i++)  
            {  
                Thread myNewThread = new Thread(DoWork);  
                Console.WriteLine(i.ToString());  
            }  
        }  

        static void DoWork()  
        {  

            lock (_object)  
            {  

                DataTable dt = new DataTable();  

                using (OracleConnection conn = new OracleConnection(connectionstring))  
                {  
                    conn.Open();  

                    using (OracleCommand cmd = new OracleCommand(query, conn))  
                    {  

                        using (OracleDataAdapter adap = new OracleDataAdapter(cmd))  
                        {  
                            adap.Fill(dt);  
                        }  

                        while (conn.State != ConnectionState.Closed) conn.Close();  
                    }  

                    conn.Dispose();  
                }  
            }  
        }   
    }

1 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但是从评论(和我自己的经验)来看,它似乎仍然困扰着某些人,所以...

我有一个类似的情况-在一个轻线程的应用程序中,连接被快速打开和关闭-甚至试图回滚到不受管理的ODP.NET。在我无法直接访问的服务器中,尝试使DLL版本匹配所带来的痛苦使我回头尝试另一种解决方案。

在我看来,这非常简单;默认最小连接池大小为1,并且托管组件在创建新组件时似乎有点慢。在this之后,我所做的是将MinPoolSize中的OracleConnectionStringBuilder属性更改为一个比我期望的并发调用的最大数目稍大的数字(本例中为15到10) ,只是为了安全起见。

到目前为止看来似乎很有魅力。