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