Oracle 快速连接故障转移不适用于 ODP.NET。获取连接请求超时错误
Oracle Fast Connection Failover not working for ODP.NET. Getting Connection Request Timeout Error
我正在为我的 MVC 项目使用 ODP.NET,当数据库出现故障然后再次启动时,我不断收到“-1000 连接请求超时错误”。一旦我回收 IIS AppPool,它就会开始工作。我尝试在 catch 块内使用 ClearAllPool()、ClearPool(connection) 来删除错误连接,但两者都不起作用。我在 Whosebug 上发现 post 通过在连接字符串中添加 HA events=true 来使用快速连接故障转移。我也试过了,但没有运气。我问过 DBA,他们说该功能默认在服务器端。我不知道为什么 ODP.NET 仍在使用数据库关闭时创建的旧的无效连接,即使数据库已启动并且 运行?我的所有代码也都包含在一个 using 块中,该块将 close/dispose 连接。我的 Oracle.DataAccess 版本是 12.1.0。我阅读了 google 上关于连接池、FCF 的每一页,但没有任何帮助。
我的连接字符串如下:
<add name="XXX"; providerName="Oracle.DataAccess.Client"; connectionString="DataSource=XXX;username=xxx;password=XXX;Pooling=True;Connection Timeout=120; Connection LifeTime=120; Validate Connection=True; Min Pool size=1;Max Pool size=180; HA events=true; Incr Pool size=5; Decr Pool size=2;"/>
这是我的 oracle 连接代码:
using(OracleConnection conn= new OracleConnection(connectionstring))
{
try
{
OracleCommand cmd=new OracleCommand("storedprocedure",conn)
{CommandType=CommandType.StoredProcedure};
//add parameters to command
foreach(var parmeter in parameters)
{
cmd.Parameters.Add(parameter);
}
conn.Open(); // this is where exception occurs
cmd.ExecuteNonQuery();
}
catch(OracleException ex)
{
if(conn.State=ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
//log exception ex in logfile
}
if(conn.State=ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
//Dispose All Parameters using Dispose() outside using statement.
foreach(var parmeter in parameters){
parameter.Dispose();
}
唯一的解决方法是设置 Pooling=False,我们不想这样做。
我试过这些连接字符串属性,例如增加最小池大小、增加连接生命周期等,但似乎没有任何效果。
非常感谢任何帮助。
谢谢。
试试这个并告诉我你是否还有这个问题
using(OracleConnection conn= new OracleConnection(connectionstring))
using(OracleCommand cmd=new OracleCommand("storedprocedure",conn))
{
cmd.CommandType=CommandType.StoredProcedure;
foreach(var parmeter in parameters)
{
cmd.Parameters.Add(parameter);
}
conn.Open(); // this is where exception occurs
cmd.ExecuteNonQuery();
}
如果不需要错误,将整个块放入 try/catch
我正在为我的 MVC 项目使用 ODP.NET,当数据库出现故障然后再次启动时,我不断收到“-1000 连接请求超时错误”。一旦我回收 IIS AppPool,它就会开始工作。我尝试在 catch 块内使用 ClearAllPool()、ClearPool(connection) 来删除错误连接,但两者都不起作用。我在 Whosebug 上发现 post 通过在连接字符串中添加 HA events=true 来使用快速连接故障转移。我也试过了,但没有运气。我问过 DBA,他们说该功能默认在服务器端。我不知道为什么 ODP.NET 仍在使用数据库关闭时创建的旧的无效连接,即使数据库已启动并且 运行?我的所有代码也都包含在一个 using 块中,该块将 close/dispose 连接。我的 Oracle.DataAccess 版本是 12.1.0。我阅读了 google 上关于连接池、FCF 的每一页,但没有任何帮助。
我的连接字符串如下:
<add name="XXX"; providerName="Oracle.DataAccess.Client"; connectionString="DataSource=XXX;username=xxx;password=XXX;Pooling=True;Connection Timeout=120; Connection LifeTime=120; Validate Connection=True; Min Pool size=1;Max Pool size=180; HA events=true; Incr Pool size=5; Decr Pool size=2;"/>
这是我的 oracle 连接代码:
using(OracleConnection conn= new OracleConnection(connectionstring))
{
try
{
OracleCommand cmd=new OracleCommand("storedprocedure",conn)
{CommandType=CommandType.StoredProcedure};
//add parameters to command
foreach(var parmeter in parameters)
{
cmd.Parameters.Add(parameter);
}
conn.Open(); // this is where exception occurs
cmd.ExecuteNonQuery();
}
catch(OracleException ex)
{
if(conn.State=ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
//log exception ex in logfile
}
if(conn.State=ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
//Dispose All Parameters using Dispose() outside using statement.
foreach(var parmeter in parameters){
parameter.Dispose();
}
唯一的解决方法是设置 Pooling=False,我们不想这样做。
我试过这些连接字符串属性,例如增加最小池大小、增加连接生命周期等,但似乎没有任何效果。
非常感谢任何帮助。
谢谢。
试试这个并告诉我你是否还有这个问题
using(OracleConnection conn= new OracleConnection(connectionstring))
using(OracleCommand cmd=new OracleCommand("storedprocedure",conn))
{
cmd.CommandType=CommandType.StoredProcedure;
foreach(var parmeter in parameters)
{
cmd.Parameters.Add(parameter);
}
conn.Open(); // this is where exception occurs
cmd.ExecuteNonQuery();
}
如果不需要错误,将整个块放入 try/catch