gpt4 book ai didi

mysql - OrmLite(服务堆栈): Only use temporary db-connections (use 'using' ?)

转载 作者:行者123 更新时间:2023-11-29 01:49:38 27 4
gpt4 key购买 nike

在过去 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,就像这样:

_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 语句中)打开一个连接吗?为每个查询执行什么操作,这不是很大的开销吗?

最佳答案

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

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

关于mysql - OrmLite(服务堆栈): Only use temporary db-connections (use 'using' ?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com