一个关于多线程和DbHelper的问题

我的初衷是这样的:在多线程环境下,每个数据库编号对应一个DbHelper对象。

下面是代码,不知道这样写有什么问题。

 1 namespace TestDAL
 2 {
 3     public class DB
 4     {
 5         private static string[] ConnString = new[]
 6         {
 7             "unknown", "Data Source=163.163.1.100;Initial Catalog=xiaomi;User Id=sa;Password=1234567890;",
 8             "Data Source=163.163.1.101;Initial Catalog=xiaomi;User Id=sa;Password=1234567890;"
 9         };
10         private static readonly ConcurrentDictionary<int, DbHelperSQLP> concurentDictionary;
11         static DB()
12         {
13             concurentDictionary = new ConcurrentDictionary<int, DbHelperSQLP>();
14         }
15         private DB()
16         {
17         }
18         public static DbHelperSQLP GetDBHelper(int id)
19         {
20             if (!concurentDictionary.ContainsKey(id))
21                 concurentDictionary.TryAdd(id, new DbHelperSQLP(ConnString[id]));
22             DbHelperSQLP db;
23             bool result = concurentDictionary.TryGetValue(id, out db);
24             return result ? db : null;
25         }
26     }
27 }

调用方法是:

 1         /// <summary>
 2         /// 得到一个对象实体
 3         /// </summary>
 4         public xiaomi GetModel(int dbno, int id)
 5         {
 6             StringBuilder strSql = new StringBuilder();
 7             strSql.Append("select  top 1 id,username,password,email,ip from xiaomi ");
 8             strSql.Append(" where [email protected]");
 9             SqlParameter[] parameters = {
10                     new SqlParameter("@id", SqlDbType.Int,4)
11             };
12             parameters[0].Value = id;
13             DbHelperSQLP helper = DB.GetDBHelper(dbno);
14             if (helper == null)
15                 throw new SqlNullValueException("没有找到数据库地址");
16             DataSet ds = helper.Query(strSql.ToString(), parameters);
17             return ds.Tables[0].Rows.Count > 0 ? DataRowToModel(ds.Tables[0].Rows[0]) : null;
18         }
时间: 2024-10-18 13:25:41

一个关于多线程和DbHelper的问题的相关文章

一个比较多线程(并行)和非多线程下完成同等任务(I/O频繁)所需开销的案例

//非多线程 package test; import java.io.*; import java.security.DigestInputStream; import java.security.MessageDigest; /* * 利用DigestInputStream完成消息摘要计算, * 先调用此摘要输入流的一个 read 方法,之后在关联的消息摘要上调用一个 digest方法. * 本案例包含两个程序,其中一个采用多线程,相互比较. */ public class DigestTh

基于c++11新标准开发一个支持多线程高并发的网络库

背景 新的c++11标准出后,c++语法得到了很多的扩展,比起以往任何时候都要灵活和高效,提高了程序编码的效率,为软件开发人员节省了不少的时间. 之前我也写过基于ACE的网络服务器框架,但ACE毕竟有些臃肿,内部对象关系错综复杂,容易给人造成只见树木不见森林的错觉. 所以打算用c++11开发一个较为简洁,高效,支持高并发的网络库. 开源         花了两三周,终于把基础的结构开发完成,代码也开源在github上,网址是 https://github.com/lichuan/fly 欢迎各位

一个java多线程面试题

线程a 打印 数字 0--12: 线程b 打印 字母 a--z; 打印结果:0ab1cd2ef3gh4ij5kl6mn7op8qr9st10uv11wx12yz 要求用到 线程间传值: 分析:线程a打印一个数字,线程b打印两个字母 , 进行13次循环, 通过公共资源类进行线程间传值 public class FftThreadTest {public static void main(String[] args) { //创建final资源对象 final Business business =

一个C#多线程的工作队列

多线程添加元素到队列中,队列根据绑定 的事件进行自动处理,可以设置WorkSequential属性来实现对队列处理的单线程(严格顺序处理)或者多线程处理(循序出队,但是 多线程处理,不保证对队列元素的处理顺利)的选择. 代码 /***********多线程的工作队列*************** * 此工作队列保证线程安全性 * * * * * *******/ namespace WorkQueue { using System.Collections.Generic; using Syste

一个java多线程实例

import java.util.List; import java.util.ArrayList; import java.util.Queue; import java.util.LinkedList; public class Test3 { public static void main(String[] args) { final Manager3 m3 = new Manager3(); m3.init(); Thread t1 = new Thread(new Runnable()

一个简单多线程购票Demo

package thread; public class Test02 { //定义初始票数 public static int chepiao = 20; public static void main(String[] args) { Test02 t = new Test02(); //匿名类创建线程 Thread t1 = new Thread() { @Override public void run() { //加同步锁 synchronized(Test02.class) { //

IOS 使用FMDB多线程访问数据库 及databaseislocked的问题

原理:文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写.在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译sqlite可以修改超时时间),就报"database is locked"错误. 所以,在操作sqlite时,应该即时关闭连接:打开连接后,尽量减少非常费时的操作. 多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizing or reset

多线程概念

一个进程是由一个或者N个线程组成的! 线程:cpu调度和分配的基本单位!电脑中真正执行的是线程! 在同一个时间点,我们的电脑只能运行一个线程 多线程: 如果在一个进程中,同时运行多个线程,来完成不同的工作,我们称之为多线程! CUP不能同时运行多个线程! 一个CPU在同一个时间点,只能运行一个线程,单线程运行的速度太快,我们肉眼无法分辨,所以我们认为是多线程! 生活中进入地铁站的例子: 场景1:现在地铁站有1个进站口,同时来了5个人! 需要排队进站! 场景2:现在地铁站有5个进站口,同时来了5个

python多线程、多进程以及GIL

多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调用start()方法,即开始运行该线程,该线程将执行函数func,当然,如果func需要参数,可以在Thread的构造函数中传入参数args=(-).示例代码如下 import threading #用于线程执行的函数 def counter(n): cnt = 0; for i in xrange