簡體   English   中英

流暢的NHibernate會話關閉數據庫連接

[英]Fluent NHibernate sessions closes the database connection

我正在使用Fluent NHibernate寫入Oracle 11g數據庫。 我不確定這是否有問題,但NHibernate驅動程序只有9和10g數據庫的配置設置。 無論如何,當我只實例化一個NHibernate SessionFactory和一個NHibernate會話時(同時使用常規會話和IStatelessSession)。 每當我對數據庫執行讀或寫操作時,Oracle sys.aud $表都會記錄正在執行的事務。 我們的DBA說這是因為連接正在登錄,然后在每次讀取或寫入事務后注銷。 通過大量查詢,我們最終會終止審計表。 我們將創建第二個數據庫用戶,對該帳戶進行調整審計,但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);
        }

在ADO.NET中建議使用每個用例打開和關閉連接

使用連接

高性能應用程序可在最短的時間內保持與正在使用的數據源的連接,並利用連接池等性能增強技術。

仔細檢查您正在使用的ADO.Net驅動程序是否啟用並支持連接池。

如果您確實需要一個全局連接,那么實現IConnectionProvider,它會在第一個CreateConnection上打開一個連接並分發每次創建的連接,但是您必須確保不會同時執行2個數據庫操作,因為這不支持連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM