OrmLite(ServiceStack):仅使用临时数据库连接(使用“使用”?)

Posted

技术标签:

【中文标题】OrmLite(ServiceStack):仅使用临时数据库连接(使用“使用”?)【英文标题】:OrmLite (ServiceStack): Only use temporary db-connections (use 'using'?) 【发布时间】:2018-04-26 07:02:12 【问题描述】:

在过去 10 多年左右的时间里,我总是打开数据库 (mysql) 的连接并保持打开状态,直到应用程序关闭。所有查询都在连接上执行。

现在,当我在 Servicestack 网页上看到示例时,我总是看到 using-block 被使用,例如:

using (var db = dbFactory.Open())

    if (db.CreateTableIfNotExists<Poco>())
    
        db.Insert(new Poco  Id = 1, Name = "Seed Data");
    

    var result = db.SingleById<Poco>(1);
    result.PrintDump(); //= Id: 1, Name:Seed Data

在我当前的测试项目中,我让 OrmLite 以我的正常方式工作(一个 db 连接,没有 using 语句),所以我基本上有一个类范围的 _db,如下所示:

_dbFactory = new OrmLiteConnectionFactory($"Uid=dbAccount.Username;Password=dbAccount.Password;Server=dbAccount.Address;Port=dbAccount.Port;Database=dbAccount.Database", MySqlDialect.Provider);

_db = _dbFactory.Open(); // var kept in memory, and used for all queries

一开始还可以,现在突然出现异常:

已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它

有些代码可能会在这里和那里运行一个SELECT,如果我理解正确的话,如果一个SELECT和一个INSERT同时发生,会出现这个错误吗?

如果是这样,最好的做法是始终为每个查询打开一个 new 连接(例如,在 using 语句中)?对每个查询执行什么操作不是很大的开销吗?

【问题讨论】:

【参考方案1】:

拥有 1 个数据库连接不是线程安全的,因此只有在最多有 1 个线程访问数据库连接时才可以选择保持连接。

大多数 ADO.NET 提供程序默认启用连接池,因此在完成连接后关闭连接会更有效,因为连接会返回池中,从而减少正在使用的活动连接数。

【讨论】:

感谢您总是非常快速地回答,感谢!是的,所以使用方式是要走的路。 .Open() 那么默认情况下不会影响性能吗? 如果 ADO.NET 提供程序启用了池(可以在连接字符串中禁用),则调用 .Open() 只会从池中检索一个打开的连接。

以上是关于OrmLite(ServiceStack):仅使用临时数据库连接(使用“使用”?)的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack Webhook + ServiceStack.Webhooks.OrmLite 订阅商店插件问题

如何修改 ServiceStack.OrmLite 生成的 SQL?

在 SQL Server 和 ServiceStack.OrmLite 中使用架构名称

ServiceStack.OrmLite 调用存储过程

使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践

使用 ormlite servicestack 加载