我正在使用流利的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);
}
感謝您的幫助。我可以考慮創建一個ICOnnectionProvider,但我不願意沿着這條路走下去,因爲似乎有更多的異常處理,如果連接丟失,我將不得不寫。我讓DBA創建一個減少日誌記錄的新帳戶,因爲它似乎更容易,不需要定製NHibernate。 – DetriusXii