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

OrmLite (ServiceStack): Only use temporary db-connections (use 'using'?)

在过去 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 以我的正常方式工作(一个数据库连接,没有使用语句),所以我基本上有一个 class-wide _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

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

There is already an open DataReader associated with this Connection which must be closed first

有些代码可能到处都是运行一个SELECT,如果我理解正确的话,如果一个SELECT和一个INSERT同时出现,就会出现这个错误?

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

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

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