关于linq to sql类线程同步问题
例如,下面一段代码,当两个线程同时访问时会出现各种由于线程不同步而导致的问题,比如什么DataReader已打开未关闭啊,已经添加了重复的键啊等等。
/// <summary>
/// 当前数据上下文,非线程安全
/// </summary>
static AouUnionPayDataContext db = new AouUnionPayDataContext(connStr); /// <summary>
/// 此处是并发发生错误的方法,当两个线程访问时会出错
/// </summary>
/// <typeparam name="T">查找的实体对象类型</typeparam>
/// <param name="predicate">查找的条件,linq to sql语法</param>
/// <returns></returns>
public T GetSingle(Expression<Func<T, bool>> predicate)
{
return db.GetTable<T>().SingleOrDefault(predicate);
}
非线程安全
主要问题在于,多线程情况下同时访问db对象,拿到db对象执行GetTable<T>()方法会出错,相当于都在使用同一个数据库DataReader。这种情况是不允许的。
当项目中很多地方都使用了db此对象,而所有的db都只允许单一线程进行操作时,这时候在代码段头尾加上lock(db){}是不够的。
可以考虑将db封装为线程安全对象,如以下代码:
/// <summary>
/// 当前数据上下文,非线程安全
/// </summary>
static AouUnionPayDataContext db = new AouUnionPayDataContext(connStr); /// <summary>
/// 线程安全的数据库访问对象
/// </summary>
protected static AouUnionPayDataContext db_safe
{
set
{
lock(db)
{
db = value;
}
}
get
{
lock(db)
{
return db;
}
}
} /// <summary>
/// 使用了线程安全对象
/// </summary>
/// <typeparam name="T">查找的实体对象类型</typeparam>
/// <param name="predicate">查找的条件,linq to sql语法</param>
/// <returns></returns>
public T GetSingle(Expression<Func<T, bool>> predicate)
{
return db_safe.GetTable<T>().SingleOrDefault(predicate);
}
线程安全封装
关于linq to sql类线程同步问题的更多相关文章
- linq to sql 类的使用
本文介绍linq to sql模型类的使用 EntityFramework是重量级的数据库模型,如果你想要一个简单轻量级的数据库模型,建议使用linq to sql类 创建模型类 在项目中添加linq ...
- LINQ to SQL 建立实体类
使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,L ...
- LINQ to SQL 建立实体类 (转)
http://www.cnblogs.com/DebugLZQ/archive/2012/11/14/2770449.html 使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就 ...
- LINQ to SQL活学活用(1):这要打破旧观念
程序架构 如今比較经典的架构,看看以下图片. 怎样实现 在一个N层应用程序中我们怎样使用LINQ to SQL呢?这给刚刚入门的朋友的确是个难题,使用LINQ to SQL就是ORM技术,能够非常轻松 ...
- Linq学习笔记四之linq to sql 的基本操作
首先需要在项目中新增一个 linq to sql 的服务 新增项,数据,LINQ TO sql 类的这个方法 第二步需要一个model类,用作映射 [Table] public class S_ZD ...
- Linq之Linq to Sql
目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...
- MVC中Linq to sql创建数据模型
1.创建新的 SQL Server 数据库 点击”视图“-->“服务器资源管理器” ,打开 “服务器资源管理器” 窗口,如下图: 右键“数据连接”,选择“创建新的SQL Server 数据库”, ...
- wcf+linq to sql中关联查询返回数据问题
前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...
- MVC3+Linq to sql 显示数据库中数据表的数据
1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...
随机推荐
- qq加好友加群限制ip怎么解决
目前各样格式的推广都会用到腾讯QQ,现在就遇到了问题.QQ加好友加群,经常会提示你的账号存在不安全因素,暂停加好友功能.这个原因都是本地同一个IP,登陆的QQ过多,加好友过多.导致这个IP被记录,相当 ...
- Python下载进度条
import dialog,e32,appuifw def ru(x):return x.decode('utf8') def qu(): appuifw.note(ru('已取消')) wait.c ...
- javascript 提取表单元素生成用于提交的对象(序列化 html 表单)
function serialize(f) { var o = {}; var s = f.getElementsByTagName("select"); for (var i = ...
- 获取Mac地址
netapi32.lib#include <NB30.h>; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER Name ...
- sqlserver 事务日志过大 收缩方法解决方案
sqlserver 事务日志过大,可能会导致备份失败或者数据库出现异常,所以要定期清除sqlserver 事务日志 建议:为了防止日志文件无限扩大,可以对日志文件作一些限制. 清除sqlserver事 ...
- 【转】一种解决h5页面背景音乐不能自动播放的方案
原文:http://www.cnblogs.com/wmhuang/p/5452259.html --------------------------------------------------- ...
- 虚拟机启动linux系统报错,此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态
在使用虚拟机启动linux的时候报错,如下: 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态. ...
- mydumper linux mysql 备份利器
1 官网 https://launchpad.net/ 2 安装使用参考网站 http://www.cnblogs.com/digdeep/p/4925560.html
- 盘点JavaScript里好用的原生API
转自:https://segmentfault.com/a/1190000002753931 解析字符串对象 我们都知道,JavaScript对象可以序列化为JSON,JSON也可以解析成对象,但是问 ...
- Java--静态区域块
public class Demo3_2 { static int i=1; static //静态区域块 { //该静态区域块只被执行一次 System.out.println("a&qu ...