【问题标题】:NHibernate: does building the session factory involve connecting to the database?NHibernate:构建会话工厂是否涉及连接到数据库?
【发布时间】:2011-08-26 08:31:17
【问题描述】:

在将数据库迁移到新服务器后,我的工作副本无法再连接到数据库。但我正在经历一些我没想到的事情。每当应用程序中的页面尝试连接到此数据库时,都会在构建会话工厂期间发生错误,即在 ISession 尝试显式连接(例如加载实体)之前。

这是对的吗?为什么构建会话工厂需要连接到数据库?

【问题讨论】:

    标签: nhibernate database-connection sessionfactory


    【解决方案1】:

    在构建会话工厂时,它会缓存大量的查询、relashionship、元数据等。如果被要求这样做,它还会创建/更新数据库。这就是我通过阅读SessionFactoryImpl 类的一些代码得到的。

    请记住,创建会话工厂的过程非常繁重,每个 DataSource 只应执行一次。如果您考虑这一点,它会缓存和引导所有可能的事情是有道理的。

    如果你真的想知道它发生的原因和作用,我建议你下载源代码并调试它。

    【讨论】:

    • 谢谢 - 我知道构建会话工厂应该只在应用程序的生命周期中发生一次。我正在开发中,所以我通过 VS Web 服务器运行应用程序,因此会话工厂频繁构建的原因。
    • 我没有通过会话工厂创建数据库,所以我仍然不知道为什么 NH 似乎在构建会话工厂时尝试连接到数据库。
    【解决方案2】:

    构建会话工厂不一定连接到数据库。我编写了一个应用程序,它实例化会话工厂以在根本没有数据库时从映射文件创建一个 sql 文件。

    但您可以建议会话工厂使用如下配置创建数据库:

    <property name="hbm2ddl.auto">create</property>
    

    我不会在生产环境中这样做,但它可能对单元测试有用。检查您的项目是否有这样的配置。

    如果没有这样的配置,请检查错误消息是否有任何有用的信息,并查看堆栈跟踪以了解它发生的位置。

    【讨论】:

      【解决方案3】:

      在构建会话工厂时,还有另一个属性可能导致数据库连接尝试。

      <property name="hbm2ddl.keywords">keywords</property>
      

      默认值“关键字”会导致这样的堆栈跟踪(使用 MySQL):

      Exception Info: System.Net.Sockets.SocketException
          at ..............
          at System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32)
          at MySql.Data.MySqlClient.MySqlConnection.Open()
          at NHibernate.Connection.DriverConnectionProvider.GetConnection()
          at NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Prepare()
          at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(NHibernate.Dialect.Dialect, NHibernate.Tool.hbm2ddl.IConnectionHelper)
          at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(NHibernate.Engine.ISessionFactoryImplementor)
          at NHibernate.Impl.SessionFactoryImpl..ctor(NHibernate.Cfg.Configuration, NHibernate.Engine.IMapping, NHibernate.Cfg.Settings, NHibernate.Event.EventListeners)
          at NHibernate.Cfg.Configuration.BuildSessionFactory()
      

      有关此功能的更多信息,请访问here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多