0

Fluent NHibernate を使用して Oracle 11g データベースに書き込みます。問題があるかどうかはわかりませんが、NHibernate ドライバーには 9 および 10g データベースの構成設定しかありません。とにかく、1 つの NHibernate SessionFactory と 1 つの NHibernate セッション (通常のセッションと IStatelessSession の両方を使用) のみをインスタンス化したとき。データベースに対して読み取りまたは書き込みを実行すると、Oracle sys.aud$ テーブルには実行中のトランザクションのログが記録されます。私たちの DBA は、接続がログインしてから、各読み取りまたは書き込みトランザクションの後にログオフしたためだと言いました。大量のクエリを使用すると、監査テーブルが強制終了されます。そのアカウントの監査を微調整して、2 番目のデータベース ユーザーを作成します。しかし、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();
    }

そして、これが私が書いたテストの Main メソッドです

 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);
        }
4

1 に答える 1

2

ユース ケースごとに接続を開いたり閉じたりすることは、ADO.NET で推奨される方法です。

接続の使用

ハイ パフォーマンス アプリケーションは、使用中のデータ ソースへの接続を最小限の時間維持し、接続プーリングなどのパフォーマンス強化テクノロジを利用します。

接続プールが有効になっており、使用している ADO.Net ドライバーでサポートされていることを再確認してください。

本当に 1 つのグローバル接続が必要な場合は、最初の CreateConnection で接続を開き、毎回作成された接続を渡す IConnectionProvider を実装します。ただし、2 つのデータベース操作が同時に実行されないようにする必要があります。繋がり。

于 2013-08-01T08:14:05.980 に答える