【发布时间】: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 语句中)?对每个查询执行什么操作不是很大的开销吗?
【问题讨论】:
标签: mysql servicestack ormlite-servicestack datareader