C# 数据库连接池 线程安全 单例模式 的实现

本文介绍3种线程安全模式

1,lock

2,Mutex

3,MethodImpl

 

以前写的一个MYSQL数据库连接池ConnectionPool.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.IO;
using System.Threading;
using MySql.Data.MySqlClient;
using System.Runtime.CompilerServices;
namespace queue.service.basic
{public class ConnectionPool{private Stack<MySqlConnection> pool;private const int POOL_MAX_SIZE = 20;private int current_Size = 0;private string ConnString = "";//连接字符串 private SysProperty sysProperty;private const string SYS_PROPERTY = "config\\SysProperty.xml";private static ConnectionPool connPool;private ConnectionPool(){if (pool == null){pool = new Stack<MySqlConnection>();}}[MethodImpl(MethodImplOptions.Synchronized)]public static ConnectionPool getInstance(){if (connPool == null){connPool = new ConnectionPool();}return connPool;}public MySqlConnection getConnection(){MySqlConnection conn;lock (this){if (pool.Count == 0){if (current_Size < POOL_MAX_SIZE){conn = createConnection();current_Size++;//把conn加入到pool 中
pool.Push(conn);}else{try{Monitor.Wait(this);}catch (Exception e){Console.WriteLine(e.Message);}}}conn = (MySqlConnection)pool.Pop();}return conn;}private string GetConnString(){if (ConnString == ""){sysProperty = new SysProperty().LoadProperty(Path.Combine(SYS_PROPERTY));string ip = sysProperty.getPropertyValue("databaseIP");string dbName = sysProperty.getPropertyValue("databaseName");string userID = sysProperty.getPropertyValue("databaseUser");string userPwd = sysProperty.getPropertyValue("databasePassword");
ConnString = "Database=" + dbName +";Data Source=" + ip +";User Id=" + userID +";Password=" + userPwd + ";" +"pooling=true;CharSet=utf8;port=3306;";}return ConnString;}public void releaseConnection(MySqlConnection conn){lock (this){pool.Push(conn);Monitor.Pulse(this);}}private MySqlConnection createConnection(){lock (this){MySqlConnection newConn = new MySqlConnection(GetConnString());newConn.Open();return newConn;}}}
}


总结:

1,上面类中使用了 主要使用了 lock 方式。

     lock()是对一个对象加互斥锁,只允许一个线程访问其后大括号中语句块,直到该语句块的代码执行完才解锁,解锁后才允许其他的线程执行其语句块。

2,单例模式使用了懒汉模式。

     饿汉式是在类装载的时候直接得到该类的实例,可以说是前期绑定的;懒汉式是后期绑定的,类加载的时候connPool是空的,在需要的时候才被创建且仅创建一次。饿汉式的速度快,效率高,但是耗费系统资源;懒汉式则相反。懒汉式还存在一个问题,就是后期绑定不能确保对象只能被实例化一次,这需要对指示类是否实例化的标志设置1个互斥锁,仅允许1个线程访问。这样就可以确保对象只被实例化一次。

3,单例模式的线程安全使用了 MethodImpl。

他指定了getInstance()方法同时只能被一个线程使用。

4,使用Mutex类进行同步

修改代码为:

private static Mutex mutex = new Mutex();public static ConnectionPool getInstance(){mutex.WaitOne();if (connPool == null){connPool = new ConnectionPool();}mutex.ReleaseMutex();return connPool;}

 

转载于:https://www.cnblogs.com/RushSykes/archive/2012/04/16/2451880.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精通ASP.NET MVC ——模型验证

文章内容较长&#xff0c;用于记录自己学习。模型验证&#xff08;Model Vaildation&#xff09;是确保应用程序所接受的数据适合于绑定到模型&#xff0c;并且在不合适时给用户提供有用的信息&#xff0c;以帮助他们修正问题的过程。 准备示例项目 新建一个空的MVC项目&…

[wbia 2.2] 对检索结果进行评估

评估对检索系统的性能&#xff1a; 由于我们这里的检索结果&#xff0c;是主要根据PageRank的排名&#xff0c;以及Lucene对文本的分词和相关性计算的最后得分&#xff0c;进行权值调整后得到的排名结果。 这里对我们检索系统的进行性能评估&#xff0c;这里主要评估的是检索结…

错误175:具有固定名称MySql.Data.MySqlClient的ADO.NET提供程序未在计算机或者应用程序配置文件中注册或者无法加载

背景&#xff1a; EF连接MySQL时报错&#xff0c;截图如下图所示&#xff1a; 网上翻阅了很多资料&#xff0c;感觉有一篇文章说的比较靠谱&#xff1a;点击阅读。解决问题的大致过程如下&#xff1a; 在尝试使用MySQL&#xff0c;ADO.NET&#xff08;数据库优先&#xff09;和…

防止刷票方法大全

1. IP限制 这是使用的最多&#xff0c;也是最广泛&#xff0c;不可少的刷票限制。而且由于专题都没有用户模块&#xff0c;使得这个方法&#xff0c;几乎成了唯一可行的手段。该方式&#xff0c;通过获取访问游客的IP地址&#xff0c;来限制其在一段时间内所能使用的票数。当然…

精通ASP.NET MVC ——URL和Ajax辅助器方法

Ajax(或者&#xff0c;如果你愿意&#xff0c;也可以称为AJAX)是 Asynchronous JavaScripts and XML(异步JavaScripts与XML)。其XML部分并不如它往常那样意义重大&#xff0c;但是异步部分却使AJax十分有用。这是后台请求服务器数据&#xff0c;而不必重载Web页面的一种模型。M…

九把巨剑,为什么会从天而降?

在那记忆的残片之中&#xff0c;他看到了九把巨剑从天而降的壮阔画面&#xff0c;还听到了长袍剑客对自己的嘱托。 九把巨剑&#xff0c;为什么会从天而降&#xff1f;这当中&#xff0c;究竟有何寓意&#xff1f; 那个长袍剑客&#xff0c;究竟又是什么人&#xff1f; 没有答案…

精通ASP.NET MVC ——控制器可扩展性

MVC中引导动作方法执行过程的请求流程管道中&#xff0c;有两个重要的部件&#xff1a;控制器工厂(Controller Factory) 和 动作调用器&#xff08;Action Invoker&#xff09;。控制器工厂负责创建对请求进行服务的控制器实例&#xff0c;动作调用器负责查找并调用控制器类中的…

永中向香港博览会主办方演示云办公(转载)

4月16号“香港国际资讯博览会”主办方香港贸发局对永中云办公产品非常感兴趣&#xff0c;由永中员工演示&#xff0c;并拍摄了演示视频。转载于:https://blog.51cto.com/premium/837675

Backbone.js学习笔记

为什么80%的码农都做不了架构师&#xff1f;>>> http://documentcloud.github.com/backbone var todoItem new TodoItem(); todoItem.url /todo; todoItem.fetch(); todoItem.get(description)var TodoItem Backbone.Model.extend({urlRoot: /todos }); var tod…

ASP.NET MVC中使用Autofac实现简单依赖注入

本文参考资料&#xff1a; 1、https://www.cnblogs.com/RayWang/p/11128554.html。 2、https://www.cnblogs.com/eedc/p/6127181.html 3、https://www.cnblogs.com/ancupofcoffee/p/5007649.html#top 前言 关于IoC和DI(依赖注入)的概念网上一搜一大把。简单来说&#xff0c;Io…

初探EntityFramework——来自数据库的EF设计器

本文通过简单的示例&#xff0c;先初步了解下EF四种设计模式之一&#xff1a;来自数据库的EF设计器。 来自数据库的EF设计器&#xff0c;顾名思义&#xff0c;需要有新建的数据库和表结构&#xff0c;才能生成EF设计器&#xff0c; 在本地新建数据库KTStore&#xff0c;并且新建…

【034】◀▶ 学习网站 问题解决

--------------------------------------------------------------------------------------------------------- ●● 目录&#xff1a; A1 ………… ArcGIS Engine 学习网站A2 ………… 其他 ArcGIS Engine 开发网站A3 ………… 程序开发技术博客A4 ………… 问题解决链接 —…

初探EntityFramework——空EF设计器模型

如果没有任何现存数据库架构&#xff0c;可以使用空的EF设计器模型。本文将通过简单示例&#xff0c;了解如何使用空EF设计器模型。 新建空的控制器应用程序EFDesignerDemo&#xff0c;如下图所示&#xff1a; 在项目中右键&#xff0c;选择“添加”&#xff0c;然后是“新建项…

Qt4小技巧——QTextEdit自动滚屏

CuteQt Blog Blog Archive Qt4小技巧——QTextEdit自动滚屏Qt4小技巧——QTextEdit自动滚屏本站所有文章由本站和原作者保留一切权力&#xff0c;仅在保留本版权信息、原文链接、原文作者的情况下允许转载&#xff0c;转载请勿删改原文内容&#xff0c; 并不得用于商业用途。…

初探EntityFramework——来自数据库的Code First

Entity Framkwork从第二版&#xff08;EF4&#xff09;开始&#xff0c;支持新的CodeFirst模式&#xff08;程序代码优先&#xff09;&#xff0c;以自定义类定义数据模型。简化了EF的开发过程。本文章使用简单的示例来说明如何使用来自数据库的CodeFirst模式。 新建一个空的控…

CentOS上安装mysql5.5.23

mysql 5.5版本需要 cmake进行编译安装安装cmake工具需安装基础编译环境 下载安装软件包&#xff1a;mysql-5.5.23.tar.gzhttp://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.23.tar.gz/from/http://mysql.he.net/cmake-2.8.*.tar.gzhttp://www.cmake.org/files/v2.8/cmak…

初探EntityFramework——空Code First模型

如果不是从现有的系统升级&#xff0c;想要创建全新的项目可以从“空Code First模型开始”。“空CodeFirst模型”要先创建类&#xff0c;Visual Studio会从项目第一次执行的时候根据连接自动创建需要的数据库结构。本文将简单示例说明如何使用“空CodeFirst模型”。 新建控制台…

初探EntityFramework——实体类结构映射

实体类与数据表的映射有一套专用的规则。Code First 采用的惯例优于预先设置的设计&#xff0c;在没有任何设置的情况下&#xff0c;自动检测模型结构并推导出默认设置以简化类的设计&#xff0c;因此不需要特别设置类的属性即可完成模型设计。 例如&#xff0c;当DbContext的模…

昨天安装复习中遇到的问题小结

1、SQL实例无法找到。 解决方法&#xff1a;在SQL服务器上&#xff0c;手工添加例外TCP 1433端口&#xff0c;因为初期搜索的资料上&#xff0c;说添加UDP的1433&#xff0c;当时还犹豫了下&#xff0c;想到是不是TCP&#xff0c;结果想着肯定资料不会错的&#xff0c;结果浪费…

深入了解EntityFramework——数据注解属性

当惯例规则不符合设计需求时&#xff0c;我们可以使用数据注解配置打造更合适的数据库模型。本文根据示例项目对常用的数据注解属性做一个简要的举例说明。 EFCodeFirst使用的约定大于配置的的编程模式&#xff0c; 这种模式利用默认约定根据我们的领域模型建立概念模型。然我们…