我在使用 Oracle ManagedDataAccess.dll 的线程代码时遇到问题。为了模拟这个问题,我创建了一个小型测试应用程序,它打开连接、执行查询并关闭连接。
发生的事情是,当我运行此代码时,conn.open() 语句中随机出现“连接请求超时”(ODP-1000)。现在我在那里做了很多谷歌搜索,它告诉我池大小太小,但这里不是这种情况,因为那样我会得到一个“池连接超时”异常 (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();
}
}
}
}