2013-07-31 44 views
0

我正在使用流利的NHibernate写入Oracle 11g数据库。我不确定是否有问题,但NHibernate驱动程序只有9和10g数据库的配置设置。无论如何,当我只实例化了一个NHibernate SessionFactory并且只有一个NHibernate会话(同时使用了一个常规会话和一个IStatelessSession)。任何时候我执行读取或写入数据库时​​,Oracle sys.aud $表都会记录正在执行的事务。我们的DBA表示,这是因为连接正在登录,然后在每次读取或写入事务后注销。有了大量的查询,我们最终会终止审计表。我们将为该账户创建第二个数据库用户,并对其进行调整审计,但是对于NHibernate来说,关闭并打开每个事务的连接的默认属性是?有没有办法阻止连接登录和注销?流利的NHibernate会话关闭数据库连接

这里的SessionFactory的配置

public static ISessionFactory getSessionFactory() { 
     var cfg = FluentNHibernate.Cfg.Db.OracleClientConfiguration.Oracle10; 
     cfg.ConnectionString(c => { 
      c.Instance(...); 
      c.Username(...); 
      c.Password(...); 
      c.Server(...); 
     }); 


     return Fluently.Configure().Database(cfg).Mappings(m => { 
      m.FluentMappings.Add<DummyDataMap>(); 
     }).BuildSessionFactory(); 
    } 

,这里是为测试我写

static void Main(string[] args) { 
     try { 
      var sessionFactory = getSessionFactory(); 

      /*using (var statelessSession = sessionFactory.OpenStatelessSession()) { 
       for (int i = 0; i < 1000; i++) { 
        var dd = new DummyData(); 
        dd.FIRST_COLUMN = i; 
        using (var t = statelessSession.BeginTransaction()) { 
         statelessSession.Insert(dd); 
         t.Commit(); 
        } 
       } 
      }*/ 
      /*using (var statefulSession = sessionFactory.OpenSession()) { 
       for (int i = 0; i < 1000; i++) { 
        var dd = new DummyData(); 
        dd.FIRST_COLUMN = i; 
        using (var t = statefulSession.BeginTransaction()) { 
         statefulSession.Save(dd); 
         t.Commit(); 
        } 
       } 
      }*/ 

      using (var statefulSession = sessionFactory.OpenSession()) { 
       for (int i = 0; i < 1000; i++) { 
        statefulSession.Query<DummyData>().Where(dd => dd.FIRST_COLUMN == i).ForEach(dd => 
         Console.Out.WriteLine(dd.FIRST_COLUMN)); 
       } 
      } 
     } catch (Exception ex) { 
      Console.Out.WriteLine(ex.Message); 
     } 

回答

2

打开主法和关闭为每个用例的连接是recommended way in ADO.NET

使用连接

高性能应用程序能够在最短的时间内保持与正在使用的数据源的连接,并充分利用性能增强技术(如连接池)。

仔细检查连接池是否由您使用的ADO.Net驱动程序启用和支持。

如果您确实需要一个全局连接,然后实现IConnectionProvider,它将在第一个CreateConnection上打开一个连接并将每次创建的操作分发出去,但是您必须确保不会同时执行2个数据库操作,因为这是不受连接支持。

+0

感谢您的帮助。我可以考虑创建一个ICOnnectionProvider,但我不愿意沿着这条路走下去,因为似乎有更多的异常处理,如果连接丢失,我将不得不写。我让DBA创建一个减少日志记录的新帐户,因为它似乎更容易,不需要定制NHibernate。 – DetriusXii