ormlite(servicestack):只使用临时数据库连接(使用'using'?)

t40tm48m  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(309)

在过去的10多年里,我一直打开数据库(mysql)的连接,并一直保持它的打开状态,直到应用程序关闭。所有查询都在连接上执行。
现在,当我在servicestack网页上看到示例时,我总是看到 using -正在使用的块,例如:

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,必须先关闭该datareader
有些代码可能在这里或那里运行select,如果我理解正确,如果select和insert同时发生,会出现这个错误吗?
如果是这样的话,最好的做法是总是为每个查询打开一个新的连接(比如,在using语句中)?对每个查询做什么,这不是很大的开销吗?

kyvafyod

kyvafyod1#

拥有1个db连接不是线程安全的,因此如果最多有1个线程访问db连接,那么保持连接只是一个选项。
默认情况下,大多数ado.net提供程序都启用连接池,因此当连接返回到池时,关闭连接会更有效,从而减少正在使用的活动连接数。

相关问题