我有一个运行时间很长的应用程序,它使用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())
。
答案 0 :(得分:1)