问题背景
-
mysql自己的连接池
mysql有连接字符串我们是知道的,大致如
server=localhost;User Id=user;password=123456;Database=test;Charset=utf8;
这样。
而这个字符串中还有多种配置,比如配置是否使用线程池等。
如果显式地指定使用线程池的话,那么就是
反之就是 server=localhost;User Id=user;password=123456;Database=test;Charset=utf8;Pooling=true;
Pooling=false;
。
这都是很容易理解的。
-
C#自己实现的连接池
如果我们自己实现一个连接池,性能会怎样呢?
ps:我之前的一篇C#版mysql连接池的案例 pps: C#自己实现的连接池,里面有一个
ReturnConnection
函数,可以在每次执行完sql之后就调用,用于“归还”此连接。这个是否有必要每次都调用,也进行了对比。
即总共五种情况对比了。
那么,上述几种情况的性能,相比之下究竟怎么样呢?
本篇文章就是为了验证这个问题。
方案:
- 随便建立一个数据库,放点数据进去以便查询,进而对比效率。
为了尽可能减少网络传输和不同连接之间互相影响的因素,这里使用了localhost数据库。并在数据库中新建了5个不同的用户,这样的话就会有五个不同的数据库连接,应该是可以排除连接之间互相影响的因素。
- 一个C#项目,使用五种方式分别执行同样的sql语句,同样多次数。最后对比时间消耗。
- 四种方式:defaultStr,poolingTrue,poolingFalse,csPool,csPoolReturn体自己理解一下就明白了。
- 特别要注意的是项目里还额外使用到了AutoFac这个IoC的库,这个不影响实验结果,只是我自己学习此框架的一点应用而已。而且代码中还要若干相关链接,有意者可学习。
-
最终对比时间,得出结论。
代码我都会上传并放上链接。
以下是执行了几次,耗时的截图。

下图是一部分的关键代码:
结论:C#自己实现的线程池性能居然是最高的,每一次都是这样。
但是每次sql执行完毕之后,是否需要调用
ReturnConnection
也不见得性能一定最高,且高也没高出多少,因此看来是不必启用。