zoukankan      html  css  js  c++  java
  • 关于linq to sql类线程同步问题

    例如,下面一段代码,当两个线程同时访问时会出现各种由于线程不同步而导致的问题,比如什么DataReader已打开未关闭啊,已经添加了重复的键啊等等。

     1           /// <summary>
     2           /// 当前数据上下文,非线程安全
     3           /// </summary>
     4           static AouUnionPayDataContext db = new AouUnionPayDataContext(connStr);
     5   
     6           /// <summary>
     7           /// 此处是并发发生错误的方法,当两个线程访问时会出错
     8           /// </summary>
     9           /// <typeparam name="T">查找的实体对象类型</typeparam>
    10          /// <param name="predicate">查找的条件,linq to sql语法</param>
    11          /// <returns></returns>
    12          public T GetSingle(Expression<Func<T, bool>> predicate)
    13          {
    14              return db.GetTable<T>().SingleOrDefault(predicate);
    15          }
    非线程安全

    主要问题在于,多线程情况下同时访问db对象,拿到db对象执行GetTable<T>()方法会出错,相当于都在使用同一个数据库DataReader。这种情况是不允许的。

    当项目中很多地方都使用了db此对象,而所有的db都只允许单一线程进行操作时,这时候在代码段头尾加上lock(db){}是不够的。

    可以考虑将db封装为线程安全对象,如以下代码:

     1         /// <summary>
     2         /// 当前数据上下文,非线程安全
     3         /// </summary>
     4         static AouUnionPayDataContext db = new AouUnionPayDataContext(connStr);
     5 
     6         /// <summary>
     7         /// 线程安全的数据库访问对象
     8         /// </summary>
     9         protected static AouUnionPayDataContext db_safe
    10         {
    11             set
    12             {
    13                 lock(db)
    14                 {
    15                     db = value;
    16                 }
    17             }
    18             get
    19             {
    20                 lock(db)
    21                 {
    22                     return db;
    23                 }
    24             }
    25         }    
    26 
    27         /// <summary>
    28         /// 使用了线程安全对象
    29         /// </summary>
    30         /// <typeparam name="T">查找的实体对象类型</typeparam>
    31         /// <param name="predicate">查找的条件,linq to sql语法</param>
    32         /// <returns></returns>
    33         public T GetSingle(Expression<Func<T, bool>> predicate)
    34         {
    35             return db_safe.GetTable<T>().SingleOrDefault(predicate);
    36         }
    线程安全封装
  • 相关阅读:
    linux 压力测试工具之ab
    docker save load export import的区别
    手把手教你打造高效的 Kubernetes 命令行终端
    K8S 中的容器编排和应用编排
    linux mount一个目录到另外一个目录
    linux sed命令详解
    各种安全证书间的关系及相关操作
    Linux Shell/Bash wildcard通配符、元字符、转义符使用
    vim打开多个文件、同时显示多个文件、在文件之间切换
    吉他演奏中的速度与节拍
  • 原文地址:https://www.cnblogs.com/zhoushiya/p/5675738.html
Copyright © 2011-2022 走看看