我有一个长时间运行的应用程序,它使用 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 返回断开连接/失效的连接。
关于c# - 丢失 Oracle 数据库连接后恢复 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503677/