问题是如何在故障后重新连接数据库Oracle
我有.net核心web项目在码头,在那里我连接到Oracle数据库。为了连接,我使用了nugget包oracleClientCore
我是如何连接和调用临时程序的:
string cs = "Data Source = 172.10.200.100:1521/dev;PERSIST SECURITY INFO=True;USER ID=test; Password=devtest;";
using (OracleConnection connection = new OracleConnection(cs)){
connection.Open();
using (OracleCommand cmd = connection.CreateCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_check_db";
cmd.ExecuteNonQuery();
connection.Close();
}
}在存储过程中,sp_check_db只是使insert into table
有时,到数据库的连接崩溃了,我得到了异常ORA-03114: not connected to ORACLE。在再次启用数据库之后,我将继续接收相同的错误ORA-03114: not connected to ORACLE,直到重新构建和重新部署项目为止。
在这种情况下,我能做什么,这是不对的行为?我的代码或连接字符串有什么问题吗?
发布于 2018-07-02 10:39:31
当应用程序依赖于外部集成(在本例中是db)时,由于修补程序、网络故障等原因,在较短的时间内无法访问,则适合实现重试策略。重试逻辑将取决于您如何配置它,在特定异常发生时重新运行代码一定的时间。
下面是一个示例,说明如何使用框架波莉实现简单的重试逻辑,如果包含ORA-03114的异常,它将在10秒内重新运行代码三次。如果代码在第三次之后仍然抛出相同的异常,那么异常将抛出。
var retryTimes = 3;
var waitBetweenExceptions = TimeSpan.FromSeconds(10);
var retryPolicy = Policy
.Handle<OracleException>(e => e.Message.Contains("ORA-03114"))
.WaitAndRetry(retryTimes, i => waitBetweenExceptions);
await retryPolicy.Execute(() =>
{
string cs = "Data Source = 172.10.200.100:1521/dev;PERSIST SECURITY INFO=True;USER ID=test; Password=devtest;";
using (OracleConnection connection = new OracleConnection(cs)){
connection.Open();
using (OracleCommand cmd = connection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_check_db";
cmd.ExecuteNonQuery();
connection.Close();
}
}
});https://stackoverflow.com/questions/51133494
复制相似问题