C#连接池
查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处
1. 建立连接池

1 using MySql.Data.MySqlClient;
2 using System;
3 using System.Collections;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace LianJieChiTest
10 {
11 public class ConnectionPool
12 {
13 private static ConnectionPool cpool = null;//池管理对象
14 private static Object objlock = typeof(ConnectionPool);//池管理对象实例
15 private int size = 1;//池中连接数
16 private int useCount = 0;//已经使用的连接数
17 private ArrayList pool = null;//连接保存的集合
18 private String ConnectionStr = "";//连接字符串
19
20 public ConnectionPool()
21 {
22 //数据库连接字符串
23 ConnectionStr = "server=localhost;User ID=root;Password=123456;database=test;";
24 //创建可用连接的集合
25 pool = new ArrayList();
26 }
27
28 #region 创建获取连接池对象
29 public static ConnectionPool getPool()
30 {
31 lock (objlock)
32 {
33 if (cpool == null)
34 {
35 cpool = new ConnectionPool();
36 }
37 return cpool;
38 }
39 }
40 #endregion
41
42 #region 获取池中的连接
43 public MySqlConnection getConnection()
44 {
45 lock (pool)
46 {
47 MySqlConnection tmp = null;
48 //可用连接数量大于0
49 if (pool.Count > 0)
50 {
51 //取第一个可用连接
52 tmp = (MySqlConnection)pool[0];
53 //在可用连接中移除此链接
54 pool.RemoveAt(0);
55 //不成功
56 if (!isUserful(tmp))
57 {
58 //可用的连接数据已去掉一个
59 useCount--;
60 tmp = getConnection();
61 }
62 }
63 else
64 {
65 //可使用的连接小于连接数量
66 if (useCount <= size)
67 {
68 try
69 {
70 //创建连接
71 tmp = CreateConnection(tmp);
72 }
73 catch (Exception e)
74 {
75 }
76 }
77 }
78 //连接为null
79 if (tmp == null)
80 {
81 //达到最大连接数递归调用获取连接否则创建新连接
82 if (useCount <= size)
83 {
84 tmp = getConnection();
85 }
86 else
87 {
88 tmp = CreateConnection(tmp);
89 }
90 }
91 return tmp;
92 }
93 }
94 #endregion
95
96 #region 创建连接
97 private MySqlConnection CreateConnection(MySqlConnection tmp)
98 {
99 //创建连接
100 MySqlConnection conn = new MySqlConnection(ConnectionStr);
101 conn.Open();
102 //可用的连接数加上一个
103 useCount++;
104 tmp = conn;
105 return tmp;
106 }
107 #endregion
108
109 #region 关闭连接,加连接回到池中
110 public void closeConnection(MySqlConnection con)
111 {
112 lock (pool)
113 {
114 if (con != null)
115 {
116 //将连接添加在连接池中
117 pool.Add(con);
118 }
119 }
120 }
121 #endregion
122
123 #region 目的保证所创连接成功,测试池中连接
124 private bool isUserful(MySqlConnection con)
125 {
126 //主要用于不同用户
127 bool result = true;
128 if (con != null)
129 {
130 string sql = "select 1";//随便执行对数据库操作
131 MySqlCommand cmd = new MySqlCommand(sql, con);
132 try
133 {
134 cmd.ExecuteScalar().ToString();
135 }
136 catch
137 {
138 result = false;
139 }
140
141 }
142 return result;
143 }
144 #endregion
145 }
146 }

2. 使用

1 MySqlConnection conn = null;
2 for (int i = 1; i <= 100000; ++i)
3 {
4 //获取连接
5 conn = ConnectionPool.getPool().getConnection();
6 try
7 {
8 //数据操作
9 MySqlCommand cmd = new MySqlCommand("Select * from zhy_testLianJie", conn);
10 MySqlDataReader dr = cmd.ExecuteReader();
11 while (dr.Read())
12 {
13 Console.WriteLine("ID:" + i + ",姓名:" + dr[1]);
14 }
15 dr.Close();
16 //将连接添加回连接池中
17 ConnectionPool.getPool().closeConnection(conn);
18 }
19 catch (Exception ex)
20 {
21 Console.WriteLine("\n异常信息:\n{0}", ex.Message);
22 break;
23 }
24 }

这里是MySql的使用方法,SqlServer与之相差就是去掉所有对象的“My”,希望可以帮助到大家
C#连接池的更多相关文章
- 连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法
本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持 ...
- C3p0连接池配置
在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Connection co ...
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- common-pool2 学习:thrift连接池的另一种实现
对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...
- druid连接池获取不到连接的一种情况
数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...
- C3P0连接池配置和实现详解
一.配置 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> ...
- hibernate+mysql的连接池配置
1:连接池的必知概念 首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了. 以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放.如果频繁的 ...
- 连接池的实现 redis例子
# -*- encoding:utf-8 -*- # import pymysql # # conn = pymysql.connect(host="127.0.0.1", por ...
- DBCP连接池配置示例
<bean id="dataSourceOracle2" class="org.apache.commons.dbcp.BasicDataSource" ...
- 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...
随机推荐
- 【LeetCode】Intersection of Two Linked Lists(相交链表)
这道题是LeetCode里的第160道题. 题目讲的: 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, ...
- NYOJ 745 蚂蚁的难题(二)
蚂蚁的难题(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种 ...
- Leetcode 354.俄罗斯套娃信封问题
俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...
- 机房合作(三):We are Team,We are Family
导读:拖拖拉拉,机房的合作也算是接近了尾声了.在这个过程中,真心是感谢我的两个组员.这个机房合作,看似简单,但我的组员给我的帮助和感动,都是不可忽略的.记得刚开始的时候,我就说过:不怕猪一样的组长,咱 ...
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
Largest Rectangle in a Histogram 这么经典的题硬是等今天碰到了原题现场懵逼两小时才会去补题.. ...
- mybatis学习(三)——接口式编程
对于上一节中的查询我们还可以通过接口的方式进行编程,开发环境和上一节一样 1.全局配置文件mybatis_config.xml(和上一节一样) <?xml version="1.0&q ...
- 【区间更新区间求和】HDU 1698 Just a Hook
acm.hdu.edu.cn/showproblem.php?pid=1698 [AC] #include<cstdio> ; #define lson (i<<1) #def ...
- 【2018.8.10】四连测day4 题解
T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...
- ElasticSearch 索引查询使用指南——详细版
我们通常用用_cat API检测集群是否健康. 确保9200端口号可用: curl 'localhost:9200/_cat/health?v' 绿色表示一切正常, 黄色表示所有的数据可用但是部分副本 ...
- *Codeforces891E. Lust
$n \leq 5000$的数列,$k \leq 1e9$次操作,每次随机选一个数-1,然后把其他数的积加入答案.问最后答案期望,$mod \ \ 1e9+7$. 略微观察可以发现答案=初始数列的积- ...