如何解决Oracle快速连接故障转移不适用于ODP.NET获取连接请求超时错误
我正在将ODP.NET用于我的MVC项目,并且在数据库关闭然后又重新启动时,始终收到“ -1000连接请求超时错误”。一旦我回收IIS AppPool,它就会开始工作。我试图在catch块内使用ClearallPool(),ClearPool(connection)来删除错误连接,但两者均无效。我在StackOverflow上找到了一个通过在连接字符串中添加HA events = true来使用快速连接故障转移的帖子。我也尝试过,但是没有运气。我问DBA,他们说默认情况下该功能在服务器端。我不知道为什么ODP.NET仍使用旧的无效连接,即使数据库已启动并正在运行,该连接也会在数据库关闭时创建?我所有的代码也都包装在using块中,它将关闭/释放连接。我的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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。