我正在使用 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);
}