繁体   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