c# - 丢失 Oracle 数据库连接后恢复 NHibernate

标签 c# sql oracle nhibernate database-connection

我有一个长时间运行的应用程序,它使用 NHibernate.ISessionFactory 连接到 Oracle 数据库。

偶尔数据库会离线(例如周末维护),但即使数据库重新在线,后续查询也会失败并出现以下异常(也显示内部异常):

NHibernate.Exceptions.GenericADOException: could not execute query
[ select .....]

  >> Oracle.ManagedDataAccess.Client.OracleException: ORA-03135: Connection lost contact

    >> OracleInternal.Network.NetworkException: ORA-03135: Connection lost contact

      >> System.Net.Sockets.SocketException: An established connection 
         was aborted by the software in your host machine

重新启动应用程序可恢复功能,但我希望应用程序能够通过“重置”连接自动应对而无需重新启动。

当我遇到这个异常时,我用我的 ISessionFactory 尝试了以下操作:

sf.EvictQueries();
sf.Close();
sf = null;
sf = <create new session factory>

但在重新创建 ISessionFactory 后看到相同的异常。我假设这是因为 NHibernate 正在缓存某种连接池中的底层断开连接?

我怎样才能说服 NHibernate 创建一个真正的新连接(或者甚至只是完全重置所有状态),从而允许我的应用程序在不重新启动应用程序的情况下自行修复连接问题?

编辑: 按照 A_J 的回答,请注意我已经为每个数据库请求调用 using (var session = _sessionFactory.OpenSession())

最佳答案

我怀疑您在启动时打开 ISession(调用 ISessionFactory.OpenSession())并在应用程序结束时关闭它。对于任何长时间运行的应用程序来说,这是错误的方法。

您应该在较低级别的时间管理连接。在 Web 应用程序中,这通常是按请求处理的。在你的情况下,你应该找到它应该是什么。如果您的 Windows 服务在指定时间后执行某些事件,那么 Timer_Tick 事件是个好地方。

我无法建议您的应用程序中的位置;您需要自己找出答案。

编辑 1

查看您的编辑和评论,我认为这与 NHibernate 没有任何关系。可能是连接池正在向 NHibernate 返回断开连接/失效的连接。

引用thisthis接受的答案。

关于c# - 丢失 Oracle 数据库连接后恢复 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503677/

相关文章:

sql - 合并两个 SQL 语句

sql - 添加 CASE 语句的结果

sql - 通过 Powershell 或 CLI 在 Azure Synapse 上运行 SQL 脚本

c# - 永远增加你得到-2147483648?

c# - 在 C# 中创建单项列表的快捷方式

c# - 可扩展性和可用性

sql - Oracle SQL Developer中的时间戳文字

sql - 有条件地选择一列

sql - 在 Oracle SQL 中,单竖线字符 ( '|') 的用途是什么?

c# - 套接字断开通知方法