重复执行时报错:连接未关闭。 返回
重复执行:
db.Ado.ExecuteCommand("update tableA set Status=2 where Id =100");
有时会报错:
there is already an open DataReader associated with this connection which must be closed first.
db(SqlSugarClient)初化代码:
var db = new SqlSugarClient(new ConnectionConfig
{
ConfigId = "default",//用于多库识别
ConnectionString = conStr,//连接符字串
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,//从特性读取主键自增信息
})
热忱回答(4)
-
fate stay night VIP0
2021/5/18https://www.donet5.com/Home/Doc?typeId=1224 基本上线程安全引起的
0 回复 -
东汉 VIP0
2021/5/18@fate stay night:如果我能保证不同线程是用不同SqlSugarClient实例,是不是就不会有问题?.net有一种简单的写法可以实现不同线程不同实例:
public class DbHelper
{
//每个线程一个实例
public static ThreadLocal<SqlSugarClient> ThreadDbInstance = new ThreadLocal<SqlSugarClient>(
() => new SqlSugarClient(new ConnectionConfig
{
ConfigId = "default",//用于多库识别
ConnectionString = S.GetDbConnectionString(null),//连接符字串
DbType = DbType.MySql,
IsAutoCloseConnection = true,
//IsShardSameThread = true,//经测试,不同线程,返回的实例还是同一个
InitKeyType = InitKeyType.Attribute
}
));
/// <summary>
/// 获取当前线程的SqlSugarClient实例
/// </summary>
public static SqlSugarClient Db
{
get { return ThreadDbInstance.Value; }
}
}
使用时就是:
DbHelper.Db.Ado.ExecuteCommand("update tableA set Status=2 where Id =100");
-----
这样可以吗?
另外IsShardSameThread = true,//经测试,不同线程,返回的实例还是同一个。IsShardSameThread 属性是干什么的?
0 回复 -
fate stay night VIP0
2021/5/18public void 方法名(){
var db= new SqlSugarClient(new ConnectionConfig);
db.xxxx
}
写成这样去测试如果可以,那么就自个找原因
0 回复 -
fate stay night VIP0
2021/5/18IsShardSameThread 这玩意儿不要用
0 回复