为什么要有连接池
数据库连接资源。假如多个用户公用一个连接,需要等待连接空隙的时候才能使用,如果有一个
用户一直用着不释放,就会造成其他用户饿死的,造成死锁。
所以使用连接池管理连接,用户使用完毕后,释放到连接池中,等待下个用户使用。连接池同时管理
多个连接。(错误的理解)
public partial class FormConnPool : Form { SqlConnection conn; object syncObject = new object(); public FormConnPool() { InitializeComponent(); string connStr = "Data Source=.;Initial Catalog=UFMeta_001;User ID=sa;Password=ufsoft"; conn = new SqlConnection(connStr); } private void button1_Click(object sender, EventArgs e) { //NewMethod(); Parallel.Invoke(new Action[] { new Action(NewMethod),new Action(NewMethod1)}); } private void NewMethod() { lock (syncObject) { if (conn.State != ConnectionState.Open) { conn.Open(); } SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from dbo.AA_Enum where localeid='zh-CN'"; SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); MessageBox.Show("Keep Connection"); conn.Close(); } } private void NewMethod1() { lock (syncObject) { if (conn.State != ConnectionState.Open) { conn.Open(); } SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "update BusinessNevagitionContent set cHtml='' where cBizSceneId='477A5DFF-AA41-4EE8-84B3-02B7FC59CFBB'"; cmd.ExecuteNonQuery(); MessageBox.Show("Wait Connection"); conn.Close(); } } private void button2_Click(object sender, EventArgs e) { NewMethod1(); } }
创建连接池的作用是:是为了把连接资源缓存起来,每次创建连接很消耗资源(windows原理)。
为什么连接开销比较大?
开发人员经常认为建立一个数据库是一个简单的要求,不就是在数据库服务器和初始化用户之间的一个网络往返吗,但实际上,一个数据库连接在驱动和数据库服务器之间有多次网络往返,例如,当某个驱动连接到Oracle或Sybase时,这个连接会有7到10和网络往返,执行了一系列的动作:
◆校验用户的身份证书
◆在数据库驱动期望的代码页设置和数据库可用的代码页设置之间进行协商(如果必要的话)
◆获取数据库版本信息
◆确定用于通信的最理想的数据库协议包大小
◆设置会话设置
此外,数据库管理(开发人员承担数据库管理员职责时的最佳做法)系统要确定建立连接使用的资源,包括性能开销较大的磁盘I/O和内存分配,你可能会认为将应用程序部署到数据库服务器上会消除网络往返,在大多数情况下这并不现实,因为现实世界中大部分企业并不会这么干,它们有很多的应用程序,有很多的数据库,此外,数据库服务器都会为数据库系统进行精心的性能调整,一般不会为不同的应用程序进行调整,即使可以在一台机器上安装数据库和应用程序,但这样也会有单点故障的隐患。
并行的时候,要么加锁,要么每次都建立新的连接对象。
线程池资源(每个线程有独立的运行空间)