在过去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-connection,没有using-statements),所以我基本上有一个全班_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
它起初工作,但现在我突然得到了例外:
已经有一个与此Connection关联的开放DataReader,必须先关闭
有些代码可能会在这里和那里运行SELECT,如果我理解正确,如果同时发生SELECT和INSERT,会出现此错误吗?
如果是这样,最好是始终为每个查询打开一个 new 连接(例如,在using语句中)?不是一个很大的开销,为每个查询做什么?
答案 0 :(得分:3)
拥有1个DB连接不是ThreadSafe,因此如果最多有1个线程访问数据库连接,那么保持连接只是一个选项。
大多数ADO.NET提供程序默认启用连接池,因此在完成连接后关闭连接会更有效,因为连接会返回到池中,这会减少正在使用的活动连接数。