NHibernate:如何设置连接超时时间

14

在NHibernate中,有没有一种全局设置来等待连接到给定数据库的时间,以避免连接失败(连接超时)?在ADO.NET中,您可以像这样为单个连接执行此操作:

是否有任何方法可以全局设置在连接到特定数据库之前等待的时间,在NHibernate中发生连接故障(连接超时)?在ADO.NET中,您可以为单个连接执行以下操作:

new SqlConnection().ConnectionTimeout = 10;

我找到了设置在命令执行失败前等待结果集的时间的方法(命令超时)。但是,显然,那不是我需要的。

3个回答

20

您可以在NHibernate配置代码中使用connection_timeout设置。有关完整详细信息,请参见文档的第3.4节

此项的XML配置如下...

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
        <property name="connection.connection_string">
            Server=(local);initial catalog=theDb;Integrated Security=SSPI
        </property>
        <property name="connection_timeout">100</property>
    </session-factory>
</hibernate-configuration>

<!-- other app specific config follows -->

我正在使用Fluent NHibernate,所以我的配置代码如下...

FluentConfiguration configuration = Fluently.Configure()
                         .Database(MsSqlConfiguration.MsSql2012.ConnectionString(ConnectionString))
                         .ExposeConfiguration(cfg => cfg
                            .SetProperty("connection_timeout", "100")
                         .Mappings(m =>
                         {
                             var cfg = CreateAutomappings();
                             m.AutoMappings.Add(cfg);
                         });

3
“命令超时”和“连接超时”是不同的。请参考此处。您提供的代码设置了命令超时,但我需要一种方法来设置连接超时。 - Igor Bendrup
连接超时 != 命令超时,即连接超时是等待连接可用的时间,而命令超时是最大命令执行时间。 - Alexander Egorov
1
正如其他人所说,我们正在寻找连接超时而不是命令超时。你的答案是误导性的,可能会导致某人更改错误的设置,这就是我为什么给你点了踩的原因。 - neoscribe
是的,在回答时我最初打错了单词,写成了“command”而不是“connection”——这是一个容易犯的错误。但我并没有费心去修改,因为我认为那些有足够经验使用NHibernate的人会发现connection_timeout设置与其命令等效项并存。然而,一些人似乎过于苛刻——即使是五年后——所以,为了他们的利益,我终于更新了它。 - amcdermott
没有名为“connection_timeout”的设置。 - Chet

12
您可以在连接字符串中设置它,"Connection Timeout=x"。

这是在我的情况下解决问题的最简单方法。在其他情况下,编写自定义连接提供程序并以编程方式设置IDbConnection.ConnectionTimeout属性可能更好。 - Igor Bendrup
5
注意,这里的“x”表示以秒为单位的时间。 - Tyler Forsythe
这个属性不是用来指定运行查询的时间,而是用来指定成功建立连接的时间,对吧? - 4imble

1
使用NHibernate,您可以自行提供连接:
sessionFactory.openSession(myConnection);

我不建议这样做,因为当会话由NHibernate管理时会更容易。
您仍然可以编写自己的连接提供程序,在创建的连接上设置任何您想要的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接