NHibernate:构建会话工厂是否涉及连接到数据库



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

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

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

但是,您可以建议会话工厂使用如下所示的配置来创建数据库:

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

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

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

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

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

如果你真的想知道它为什么会发生以及它的作用,我建议你下载源代码并调试它。

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

<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()

有关此功能的更多信息,请参阅此处。

最新更新