连接池是用来建立一些和db的连接,使用户访问数据库时可以直接使用 这些现成的连接。 如果不建立连接池,每个用户每一次访问db时都要和db建立一次连接, 这样数据库服务器容易产生连接过多的错误,用户也会觉得速度很慢。 web 编程,如果使用的是:客户端---web server---database server . 这种架构的,建议使用连接池的方法处理web server 与 database server 间的 通讯。
连接池顾名思义 应该9是Connect Pool的意思吧在Visual Studio .NET/C#.NET里有这个东西吗?在哪里呀?它有什么用?如果它真是一个“池子”应该有大小吧在哪里设置呢?如果“池子”满了是不是别人就连不上了我的程序了呀?那么我该如何倒掉点水(或者把池子倒干也可以)让别的人能进来???能用代码实现吗?还是在WebConfig里配置??不会还要在SQL数据库里搞点什么吧??!!真郁闷呀晕 ~!~
如果你的SQL server的话,你有必要了解这么多麽,你的连接串这样写就支持连接池了! Server=127.0.0.1;database=bbs;uid=sa;pwd=sasa;Pooling=true; Connection Reset=false; Min Pool Size=3;Max Pool Size=100
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace PengeSoft
{
/// <summary>
///SQL SERVER数据库操作基类(继承该类可能操作数据库)
/// </summary>
public class CDbObject
{
private string conString;private ECommandType commandType = ECommandType.Text;private SqlConnection sqlConn;/// <summary>
/// 默认构造函数(从配置文件中读取关键字为connectionString的值作为连接字符串)
/// </summary>
public CDbObject ()
{
try
{
conString = ConfigurationSettings.AppSettings ["connectionString"];
}
catch
{
conString = string.Empty;
}sqlConn = new SqlConnection ();
}/// <summary>
/// 构造函数(使用连接字符串初始化该项对象)
/// </summary>
/// <param name="conString">连接字符串</param>
public CDbObject (string conString)
{
this.conString = conString;
sqlConn = new SqlConnection ();
}/// <summary>
/// 构造函数(使用连接字符串和命令字符串解释类型初始化该项对象)
/// </summary>
/// <param name="conString">连接字符串</param>
/// <param name="commandType">指定如何解释命令字符串</param>
public CDbObject (string conString, ECommandType commandType)
{
this.conString = conString;
this.commandType = commandType;
sqlConn = new SqlConnection ();
}/// <summary>
/// 构造函数(使用命令字符串解释类型初始化该项对象)
/// </summary>
/// <param name="commandType">指定如何解释命令字符串</param>
public CDbObject (ECommandType commandType) : this ()
{
this.commandType = commandType;
}
/// <summary>
/// 设置如何解释命令字符串
/// </summary>
public ECommandType ECommandType
{
get
{
return this.commandType;
}
set
{
this.commandType = value;
}
}/// <summary>
/// 获取或设置数据库连接字符串
/// </summary>
public string ConnectionString
{
get
{
return this.conString;
}
set
{
if (value == string.Empty)
{
throw new Exception ("数据库连接字符串不能为空");
}this.conString = value;
}
}private void Open ()
{
try
{
sqlConn.ConnectionString = conString;
sqlConn.Open ();
}
catch (SqlException e)
{
throw e;
}
}private void Close ()
{
if (sqlConn.State == ConnectionState.Open)
{
try
{
sqlConn.Close ();
}
catch (SqlException e)
{
throw e;
}
}
}private SqlCommand BuildQueryCommand (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = new SqlCommand(procName, sqlConn);
switch (commandType)
{
case ECommandType.StroedProcedure:
sqlComm.CommandType = CommandType.StoredProcedure;
break;
case ECommandType.Text:
sqlComm.CommandType = CommandType.Text;
break;
}if (arrParam != null)
{
foreach (SqlParameter param in arrParam)
{
sqlComm.Parameters.Add (param);
}
}
return sqlComm;
}private SqlCommand BuildQueryCommandByReturnValue (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = BuildQueryCommand (procName, arrParam);
sqlComm.Parameters.Add ("@returnValue", SqlDbType.Int);
sqlComm.Parameters ["@returnValue"].Direction = ParameterDirection.ReturnValue;
return sqlComm;
}/// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行(默认参数为null)
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <returns>结果集中第一行的第一列或空引用(如果结果集为空)。</returns>
public object ExecuteScalar (string procName)
{
return ExecuteScalar (procName, null);
}/// <summary>
/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <param name="arrParam">参数数组,如果没有参数则为null</param>
/// <returns>结果集中第一行的第一列或空引用(如果结果集为空)。</returns>
public object ExecuteScalar (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = null;
try
{
Open ();
sqlComm = this.BuildQueryCommand (procName, arrParam);
return sqlComm.ExecuteScalar ();
}
catch (SqlException)
{
throw;
}
finally
{
sqlComm.Dispose ();
Close ();
}
}
/// 执行数据的查询操作,并返回一个SqlDataReader(默认参数为null)
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <returns>返回SqlDataReader</returns>
public SqlDataReader ExecuteReader (string procName)
{
return ExecuteReader (procName, null);
}/// <summary>
/// 执行数据的查询操作,并返回一个SqlDataReader
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <param name="arrParam">参数数组,如果没有参数则为null</param>
/// <returns>返回SqlDataReader</returns>
public SqlDataReader ExecuteReader (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = null;
try
{
Open ();
sqlComm = this.BuildQueryCommand (procName, arrParam);
return sqlComm.ExecuteReader (CommandBehavior.CloseConnection);
}
catch (SqlException)
{
throw;
}
finally
{
sqlComm.Dispose ();
}
}/// <summary>
/// 执行数据的添加、删除、修改操作并返回受影响的行数(默认参数为null)
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery (string procName)
{
return ExecuteNonQuery (procName, null);
}/// <summary>
/// 执行数据的添加、删除、修改操作并返回受影响的行数
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <param name="arrParam">参数数组,如果没有参数则为null</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = null;
try
{
Open ();
sqlComm = this.BuildQueryCommand (procName, arrParam);
return sqlComm.ExecuteNonQuery ();
}
catch (SqlException)
{
throw;
}
finally
{
sqlComm.Dispose ();
Close ();
}
}/// <summary>
/// 执行数据的添加、删除、修改操作并返回受影响的行数和返回值
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <param name="arrParam">参数数组,如果没有参数则为null</param>
/// <param name="returnValue">返回值</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery (string procName, out object returnValue, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = null;
int num;
try
{
Open ();
sqlComm = this.BuildQueryCommandByReturnValue (procName, arrParam);
num = sqlComm.ExecuteNonQuery ();
returnValue = sqlComm.Parameters ["@returnValue"].Value;
return num;
}
catch (SqlException)
{
throw;
}
finally
{
sqlComm.Dispose ();
Close ();
}
}/// <summary>
/// 执行数据的查询操作,并返回数据表(DataTable)
/// </summary>
/// <param name="procName">存储过程名或SQL语句</param>
/// <param name="arrParam">参数数组,如果没有参数则为null</param>
/// <returns>数据表(DataTable)</returns>
public DataTable ExecuteByDataTable (string procName, params SqlParameter[] arrParam)
{
SqlCommand sqlComm = null;
DataTable dt = new DataTable ();
try
{
Open ();
sqlComm = this.BuildQueryCommand (procName, arrParam);
SqlDataAdapter adapter = new SqlDataAdapter (sqlComm);
adapter.Fill (dt);
return dt;
}
catch (SqlException)
{
throw;
}
finally
{
sqlComm.Dispose ();
Close ();
}
}/// <summary>
/// 利用参数名数组和参数值数组返回参数数组
/// </summary>
/// <param name="paramName">参数名数组</param>
/// <param name="paramValue">参数值数组</param>
/// <returns>参数数组(SqlParameter)</returns>
public static SqlParameter[] CreateParameter (string[] paramName, object[] paramValue)
{
SqlParameter[] arrParam = null;int num = paramName.Length;if (num > 0)
{
arrParam = new SqlParameter [num];
for (int i=0;i<num;i++)
{
arrParam [i] = new SqlParameter (paramName [i], paramValue [i]);
}
}
return arrParam;
}
}
}
这些现成的连接。
如果不建立连接池,每个用户每一次访问db时都要和db建立一次连接,
这样数据库服务器容易产生连接过多的错误,用户也会觉得速度很慢。
web 编程,如果使用的是:客户端---web server---database server .
这种架构的,建议使用连接池的方法处理web server 与 database server 间的
通讯。
连接池 并不是,Water Pool,更不能把它当作你家的水缸,:)
如果你用的连接池来连库的,如果取不出数据,可能是你的连接代码,或是连接配置有问题,
别人连不上你的程序,可能是你的WEB配置有问题,但不能说明是连接池是问题,
更不能说明是你家的水缸满;
当程序需要数据库连接的时候,到连接池中找是不是有现成的空闲的已经开启的数据库连接,如果有就直接给程序,没有才创建一个新的。当程序不要数据库连接了的时候,也不立即把它关闭,而是把它标记为空闲;哪果你每次创建连接都不关闲的话,如果超时的话,他会自动关闲,
所以说,你家的水缸是不会满的,因为,它下面有个洞,会漏水,
不过,有限制的数据库哪里,因为他有客户限制的,增加一个客户,就要付一定的Pay。
Server=127.0.0.1;database=bbs;uid=sa;pwd=sasa;Pooling=true; Connection Reset=false; Min Pool Size=3;Max Pool Size=100
把.NET关闭,再打开,就能连接上了5555555555555555
还好,今天了解了一下链接池呵
http://blog.csdn.net/guanzhongs/archive/2006/03/14/624251.aspx
http://blog.csdn.net/guanzhongs/archive/2006/03/26/638772.aspx