2

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

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

4

3 回答 3

2

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

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

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

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

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

于 2011-05-16T13:22:41.377 回答
1

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

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

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

于 2011-05-16T11:33:56.700 回答
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()

可以在此处找到有关此功能的更多信息。

于 2019-09-11T21:37:46.237 回答