2013-07-31 40 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