例如,下面一段代码,当两个线程同时访问时会出现各种由于线程不同步而导致的问题,比如什么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类线程同步问题的更多相关文章

  1. linq to sql 类的使用

    本文介绍linq to sql模型类的使用 EntityFramework是重量级的数据库模型,如果你想要一个简单轻量级的数据库模型,建议使用linq to sql类 创建模型类 在项目中添加linq ...

  2. LINQ to SQL 建立实体类

    使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就是实体类.在运行时,LINQ to SQL 根据LINQ表达式或查询运算符生成SQL语句,发送到数据库进行操作.数据库返回后,L ...

  3. LINQ to SQL 建立实体类 (转)

    http://www.cnblogs.com/DebugLZQ/archive/2012/11/14/2770449.html 使用LINQ to SQL时,需要首先建立用于映射数据库对象的模型,也就 ...

  4. LINQ to SQL活学活用(1):这要打破旧观念

    程序架构 如今比較经典的架构,看看以下图片. 怎样实现 在一个N层应用程序中我们怎样使用LINQ to SQL呢?这给刚刚入门的朋友的确是个难题,使用LINQ to SQL就是ORM技术,能够非常轻松 ...

  5. Linq学习笔记四之linq to sql 的基本操作

    首先需要在项目中新增一个 linq  to sql 的服务 新增项,数据,LINQ TO sql 类的这个方法 第二步需要一个model类,用作映射 [Table] public class S_ZD ...

  6. Linq之Linq to Sql

    目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...

  7. MVC中Linq to sql创建数据模型

    1.创建新的 SQL Server 数据库 点击”视图“-->“服务器资源管理器” ,打开 “服务器资源管理器” 窗口,如下图: 右键“数据连接”,选择“创建新的SQL Server 数据库”, ...

  8. wcf+linq to sql中关联查询返回数据问题

    前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...

  9. MVC3+Linq to sql 显示数据库中数据表的数据

    1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...

随机推荐

  1. 自定义scrollview右侧的滑动条

    在做这个功能之前我其实是拒绝的,为什么这么说呢,因为我怕麻烦啊!(开玩笑的,怕麻烦就不做程序员了) 很久没有写博客,这次刚好项目中有个有趣的东西,想拿出来分享一下,希望能帮到某些小伙伴. 首先说说需求 ...

  2. netperf安装及使用

    一.简介 Netperf是由惠普公司开发的,测试网络栈.即测试不同类型的网络性能的benchmark工具,大多数网络类型TCP/UPD端对端的性能,得到网络上不同类型流量的性能参数.Netperf根据 ...

  3. 【oracle】 oracle学习笔记1--安装与登录

    由于机器配置原因,加上也是自学,所以就没必要安装专业版的oracle,于是就安装的oracle xe版本 下载地址:http://www.oracle.com/technetwork/database ...

  4. Python压缩

    ru=lambda x:x.decode('u8') rp=lambda x:x.replace('\\','/') gb=lambda x:x.decode('gbk') class ZIP: de ...

  5. Maplace.js – 小巧实用的 jQuery 谷歌地图插件

    Maplace.js是一个小的显示谷歌地图的 jQuery 插件,帮助你把谷歌地图嵌入到你的网站,快速在地图位置上创建标记和控制菜单.它需要 jQuery 和谷歌地图 API v3 支持,所以这两个都 ...

  6. pip常见操作收录

    由于这些东西比较容易忘掉,在这里几下吧 1. pip 对应用进行安装: sudo pip install  your_app 2. pip 对应用进行update sudo pip install   ...

  7. ES5——函数,对象,方法,this

    JS由表达式和语句组成 表达式:计算出一个值,但并不进行任何操作,不改变计算机运行状态 语句:包括 声明语句,赋值语句,控制结构 函数,对象,方法,this 数组和对象:是两个非常重要的数据类型 函数 ...

  8. FTP多任务下载实现类

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. c# 打乱数组

    有时候得到了一个List,我想把它随机排列一下顺序.而且如果针对不同类型的List都能用,就要用到泛型. 其实思想很简单,就是从原List中每次随机取一项,添加到新的List中,并在原List中删除. ...

  10. 我们应当怎样学习HTML和CSS

    目标读者:web前端小白.大神请绕路 学习一门新技术,应当找一本经典入门书,在两三天之内快速翻阅完毕,了解其概貌. 然后再制定一个学习路线图(这个路线图绝大多数情况下非书本目录的顺序),接着遵循学习路 ...