有这样一个需求:需要将之前的一个数据库拆分成多个业务库
分成会员库,日志库,机票业务、旅游业务等
现在使用的是单例模式,通过每次查询或新增数据,传入对应的conn,去创建context.
if (context == null)
{
context = new DBContextEntities(whereDb);
CallContext.SetData("DbContext", context);
oldDb = whereDb;
}
else if (oldDb == whereDb)
{
}
else
{
context = new DBContextEntities(whereDb);
CallContext.SetData("DbContext", context);
oldDb = whereDb;
}
//
结果就有问题了,比如一个用户在执行批量插入操作。先foreach追加到上下文
db.Set<T>().Add(entity); 然后db.savechanges保存
如果同时有其他用户在访问网站,就会导致savechanges已经提交。
批量操作的用户虽然方法提示成功,但是insert into的数量不对。
多个上下文
多上下文是可以的,总感觉不是太好。
既然采用了单例模式为什么会insert into的数量不对呢?不是每次都能保证savechanges的时候只有一个数据上下文吗
我猜只是context 做了单例,应该也没用IOC之类的吧,简单粗暴去掉单例,每次new context搞定。
是的 没有使用
这是肯定的,,你应该避免foreach追加到上下文,,因为如果在你本次savechange之前就有其他操作进行了 savechange就已经直接保存到数据库中了,所以需要foreach数据比较多比较耗时的话,可以先append到内存中最后进行 添加到context再进行savechange ,ef底层也是ado.net 如果ado.net开启了连接池,就算你每次都进行new 其实耗性能不太大的
你说的append到内存和我上面写的.add(entity)是一样的吧 ,就是追加到内存,然后最后savechanges保存的,主要是多个数据库链接,导致了,对第一个数据库的操作没有完成,已经对第二个数据库进行操作,导致第一个提交了一部分
@代码小六: 我不知道你的.add(entity)整个add过程用的是多久时长是秒内还是分分钟,,如果是秒内,,确实没什么太大区别,,但是你可以试试线add到内存,,再addrange整个列表 再进行savechange(这个我没试过,,只是提个建议)
既然数据拆分了,为什么业务系统不拆分,做成多个微型服务不是更加好?