将数据库迁移到新服务器后,我的工作副本无法再连接到数据库。但我正在经历一些我没想到的事情。每当应用程序中的页面尝试连接到该数据库时,在会话工厂的构建过程中就会发生错误,即在 ISession 尝试显式连接(例如加载实体)之前。
这是正确的吗?为什么构建会话工厂需要连接到数据库?
将数据库迁移到新服务器后,我的工作副本无法再连接到数据库。但我正在经历一些我没想到的事情。每当应用程序中的页面尝试连接到该数据库时,在会话工厂的构建过程中就会发生错误,即在 ISession 尝试显式连接(例如加载实体)之前。
这是正确的吗?为什么构建会话工厂需要连接到数据库?
构建会话工厂不一定连接到数据库。我编写了一个应用程序,它实例化会话工厂以在根本没有数据库时从映射文件创建一个 sql 文件。
但是您可以建议会话工厂使用如下配置创建数据库:
<property name="hbm2ddl.auto">create</property>
我不会在生产中这样做,但它可能对单元测试有用。检查您的项目是否有这样的配置。
如果没有这样的配置,请检查错误消息是否有任何有用的信息,并查看堆栈跟踪以了解它发生的位置。
在构建会话工厂时,它会缓存大量的查询、关系、元数据等。如果被要求这样做,它还会创建/更新数据库。这就是我通过阅读SessionFactoryImpl类的一些代码得到的。
请记住,创建会话工厂的过程非常繁重,每个 DataSource 只应执行一次。如果您考虑这一点,它会缓存和引导所有可能的事情是有道理的。
如果你真的想知道它为什么会发生以及它做了什么,我建议你下载源代码并调试它。
在构建会话工厂时,还有另一个属性可能导致数据库连接尝试。
<property name="hbm2ddl.keywords">keywords</property>
默认值 'keywords' 会导致这样的堆栈跟踪(使用 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()
可以在此处找到有关此功能的更多信息。