我有一个长时间运行的应用程序,它使用NHibernate.ISessionFactory
连接到Oracle数据库。丢失Oracle数据库连接后恢复NHibernate
偶尔数据库脱机时(如周末的维护),但即使一旦数据库恢复联机,后续查询失败,以下异常(内部异常所示):
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())
。
连接池是ADO.Net的职责,而不是NHibernate。 –