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