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

时间:2016-11-09 09:34:06

标签: 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())

1 个答案:

答案 0 :(得分:1)

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

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

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

编辑1

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

参考thisthis接受的答案。