【问题标题】:How to globally change the command timeout using ServiceStack.OrmLite如何使用 ServiceStack.OrmLite 全局更改命令超时
【发布时间】:2015-05-04 13:46:17
【问题描述】:

我有一个基于报告的网站,使用 ServiceStackOrmLite,使用 SQL Server 后端。由于某些报告的持续时间,我想全局或选择性地(通过Service-派生类或某些属性)使运行报告的查询具有更长的CommandTimeout。我想继续使用现有代码来查询报告数据(Db.SelectDb.SqlList 调用),因此我不必在每个报告类和方法中编写样板代码。

我尝试过使用AlwaysUseCommand,但这需要声明一个具有打开连接的命令。如果不在我的 AppHost.Configure 方法中打开连接并且从不关闭它,我不知道如何做到这一点。如果它是一个函数指针会更好,但是唉。

我还研究了覆盖ServiceDb 属性,但这只是返回一个打开的IDbConnection,而不会让我覆盖创建的命令。

似乎我的最后一个选择是创建一个自定义 DbConnection 类,就像 MiniProfiler 的 ProfiledDbConnection 一样,但我必须实现十几个抽象方法。在 DbCommand 上设置一个属性似乎有点过头了。

那么,在ServiceStack.OrmLite中,如何全局修改创建的DbCommands中的CommandTimeout

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    您可以通过以下方式全局更改CommandTimeout

    OrmLiteConfig.CommandTimeout = NewTimeoutInSeconds;
    

    作用域超时

    您还可以为特定的数据库连接指定超时:

    using (var db = dbFactory.OpenDbConnection())
    {
        db.SetCommandTimeout(NewTimeoutInSeconds);
    }
    

    【讨论】:

    • * 掌心* 星期五快乐。
    • 还有一个问题——如果我们有多个数据库连接,或者只想在特定情况下应用覆盖怎么办?基本上 - 静态全局命令和单个命令之间有什么关系吗?
    • @jklemmack 更新了答案,为单个数据库连接指定了命令超时。
    • 引用:“在线程应用程序中使用 db.SetCommandTimeout 时要非常小心,因为在我们的例子中,它似乎会导致运行命令在其他线程上的其他连接上立即超时。设置全局选项解决了这个问题。当我们通过设置 0 将超时设置为无限制时,我们只花了 3 天时间来弄清楚为什么 30 秒后执行 1 个线程有效并且多次超时。如果可能的话,使用全局设置来避免很多痛苦。” - itdaan.com/faq/2014/09/18/101151674.html
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2011-01-20
    • 2010-11-14
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2022-06-27
    相关资源
    最近更新 更多