最大连接池的问题,如何解决???

gdoucwx 2008-07-10 03:18:02
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// DataBase 的摘要说明
/// </summary>
public class DataBase
{
private static DataBase _instance;

//私有化构造器
private DataBase()
{
}

//获取DataBase的实例
public static DataBase GetInstance()
{
if (_instance == null)
{
_instance = new DataBase();
}
return _instance;
}

//创建数据库连接,返回一个SqlConnection
public static SqlConnection ReturnConn()
{
string strConn = ConfigurationManager.ConnectionStrings["GDOUSCIMISConn"].ConnectionString;
SqlConnection Conn = new SqlConnection(strConn);
if (Conn.State.Equals(ConnectionState.Closed))
{
Conn.Open();
}
return Conn;
}

//根据参数,调用重载方法,执行存储过程,返回一个SqlCommand
public static SqlCommand CreateCmd(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Connection = Conn;
Cmd.CommandText = procName;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
{
if (parameter != null)
{
Cmd.Parameters.Add(parameter);
}
}
}
return Cmd;
}
//根据参数调用重载方法,执行存储过程返回DataTable
public static DataTable RunProcGetTable(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}

原来我是这样写的,这样的话多人一起访问的时候,就会出现
"异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。"
在web.config里我已经设置了如下:
<connectionStrings>
<add name="GDOUSCIMISConn" connectionString="Data Source=K513CSERVER;Initial Catalog=GDOUSCIMIS;User ID=sa;Password=123456;Max Pool Size = 300;" providerName="System.Data.SqlClient"/>
</connectionStrings>

请问如何解决?
...全文
172 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdoucwx 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jxzhong2000 的回复:]
建议楼主把WEB.CONFIG中的DEBUG关闭掉
[/Quote]
这样做会不会有其它隐患呀?会不会出现其它的问题?

Max Pool Size = 300? 300还小吗?改大点服务器负担会不会更大呀?
kyle315 2008-07-12
  • 打赏
  • 举报
回复
Max Pool Size = 300?
改大点不就得了。
数据库操作时用using语句来关闭连接。
或者用在连接语句中加入polling=false
jxzhong2000 2008-07-12
  • 打赏
  • 举报
回复
建议楼主把WEB.CONFIG中的DEBUG关闭掉
gdoucwx 2008-07-12
  • 打赏
  • 举报
回复
对于数据库的活动监视器是什么?
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
请问“数据库的活动监视器”是什么,从来没有用过呀,这是在哪里的呢,请指点一下。谢谢。
lvfeng180 2008-07-10
  • 打赏
  • 举报
回复
现在还不会代码的重用??

直接用微软提供的数据访问模块就可以了.

或者网上下载一个
臭写代码的 2008-07-10
  • 打赏
  • 举报
回复
直接去数据库的活动监视器里边看看是那些应用在占用资源,然后在分析原因!不知道行不行?
viena 2008-07-10
  • 打赏
  • 举报
回复
CreateCmd这个方法是有问题的
在里面负责打开连接,却没有负责关闭,违反开闭对称原则

正确的做法
要么在这方法里,执行完后,关闭连接

要么把连接打开放在外面
调用时再负责打开连接,把连接用参数传入,
得到SqlCommand对象并执行完后,由调用方负责关闭连接
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
我把整个类发上来,给你看一下,你就知道了。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// DataBase 的摘要说明
/// </summary>
public class DataBase
{
private static DataBase _instance;

//私有化构造器
private DataBase()
{
}

//获取DataBase的实例
public static DataBase GetInstance()
{
if (_instance == null)
{
_instance = new DataBase();
}
return _instance;
}

//创建数据库连接,返回一个SqlConnection
public static SqlConnection ReturnConn()
{
string strConn = ConfigurationManager.ConnectionStrings["GDOUSCIMISConn"].ConnectionString;
SqlConnection Conn = new SqlConnection(strConn);
if (Conn.State.Equals(ConnectionState.Closed))
{
Conn.Open();
}
return Conn;
}

//根据参数,调用重载方法,执行存储过程,返回一个SqlCommand
public static SqlCommand CreateCmd(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Connection = Conn;
Cmd.CommandText = procName;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
{
if (parameter != null)
{
Cmd.Parameters.Add(parameter);
}
}
}
return Cmd;
}


public static SqlCommand CreateCmd(string procName)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand();
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Connection = Conn;
Cmd.CommandText = procName;
return Cmd;
}



//根据传入的Sql语句,返回一个SqlCommand
public static SqlCommand CreateSqlCmd(string sqlSting)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = new SqlCommand(sqlSting, Conn);
return Cmd;
}


//根据参数调用重载方法,执行存储过程返回数据集SqlDataReader
public static SqlDataReader RunProcGetReader(string procName, SqlParameter[] prams)
{
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataReader Dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
return Dr;
}

public static SqlDataReader RunProcGetReader(string procName)
{
SqlCommand Cmd = CreateCmd(procName);
SqlDataReader Dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
return Dr;
}


///根据传入的Sql语句,返回数据集SqlDataReader
public static SqlDataReader RunStringGetReader(string sqlString)
{
SqlCommand Cmd = CreateSqlCmd(sqlString);
SqlDataReader Dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
return Dr;
}


//根据参数调用重载方法,执行存储过程返回DataTable
public static DataTable RunProcGetTable(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}

public static DataTable RunProcGetTable(string procName)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}


//根据传入的Sql语句,返回数据集DataTable
public static DataTable RunStringGetTable(string sqlString)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateSqlCmd(sqlString);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);

DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;

}

//根据参数,调用重载方法,执行存储过程,返回受影响的行数
public static int RunExecuteProc(string procName)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName);
int intResult = Cmd.ExecuteNonQuery();
Conn.Close();
return intResult;
}


public static int RunExecuteProc(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
int intResult = Cmd.ExecuteNonQuery();
Conn.Close();
return intResult;
}

//根据传入的sql语句,返回受影响的行数
public static int RunExecuteString(string sqlString)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateSqlCmd(sqlString);
int intResult = Cmd.ExecuteNonQuery();
Conn.Close();
return intResult;
}

//根据参数,调用重载方法,执行存储过程,返回首行首列
public static string RunExecuteProcScalar(string procName)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName);
string stringScalar = Convert.ToString(Cmd.ExecuteScalar());
Conn.Close();
return stringScalar;
}

public static string RunExecuteProcScalar(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
string stringScalar = Convert.ToString(Cmd.ExecuteScalar());
Conn.Close();
return stringScalar;
}

/// <summary>
/// 根据传入的sql语句,返回首行首列
/// </summary>
/// <param name="sqlString"></param>
/// <returns></returns>
public static string RunExecuteStringScalar(string sqlString)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateSqlCmd(sqlString);
string stringScalar = Convert.ToString(Cmd.ExecuteScalar());
Conn.Close();
return stringScalar;
}


//根据传入的存储过程名和参数,获得分页数据源PagedDataSource
public static PagedDataSource RunProcGetPds(string procName, SqlParameter[] prams)
{
PagedDataSource pds = new PagedDataSource();
pds.DataSource = RunProcGetTable(procName, prams).DefaultView;
pds.AllowPaging = true;
return pds;
}

//根据传入的存储过程名,获得分页数据源PagedDataSource
public static PagedDataSource RunProcGetPds(string procName)
{
PagedDataSource pds = new PagedDataSource();
pds.DataSource = RunProcGetTable(procName).DefaultView;
pds.AllowPaging = true;
return pds;
}

//根据传入的sql语句,获得分页数据源PagedDataSource
public static PagedDataSource RunStringGetPds(string sqlString)
{
PagedDataSource pds = new PagedDataSource();
pds.DataSource = RunStringGetTable(sqlString).DefaultView;
pds.AllowPaging = true;
return pds;
}
/// <summary>
/// 编辑时,根据传过来的id绑定对应的内容显示出来
/// </summary>
/// <returns></returns>
public static DataRowView RunViewGetString(String str)
{
SqlConnection Conn = ReturnConn();

SqlDataAdapter sda = new SqlDataAdapter(str, Conn);
DataSet ds = new DataSet();
sda.Fill(ds,"edittable");
return ds.Tables["edittable"].DefaultView[0];
}

}



请问如何改比较好,才不会出现连接池错误的问题与并发访问错误。
viena 2008-07-10
  • 打赏
  • 举报
回复
CreateCmd方法只是返回了一个SqlCommand对象
但你得到这个SqlCommand对象后做了什么,我就不知道了
关闭连接了吗?
gdoucwx 2008-07-10
  • 打赏
  • 举报
回复
//根据参数调用重载方法,执行存储过程返回DataTable
public static DataTable RunProcGetTable(string procName, SqlParameter[] prams)
{
SqlConnection Conn = ReturnConn();
SqlCommand Cmd = CreateCmd(procName, prams);
SqlDataAdapter Dtr = new SqlDataAdapter();
DataSet Ds = new DataSet();
Dtr.SelectCommand = Cmd;
Dtr.Fill(Ds);
DataTable Dt = Ds.Tables[0];
Conn.Close();
return Dt;
}

非常感谢你的回答。
我们每个方法都在Conn.Close();这里关闭,也尝试了在Conn.Close();后面加Conn.Dispose();但是还是出现连接池错误。这位老兄,可否发一份代码上来看看。
谢谢了!
stning 2008-07-10
  • 打赏
  • 举报
回复
检查其他的地方吧。
viena 2008-07-10
  • 打赏
  • 举报
回复
最好用try catch finally处理异常
把可能发生异常的代码放在try里面
如果有事务,要在catch中回滚事务
而连接关闭要放在finally里面
viena 2008-07-10
  • 打赏
  • 举报
回复
另外,代码中没有异常处理,也是个问题
如果发生异常,你如何保证连接能关闭?

CreateCmd中负责打开连接,但是在哪里关闭呢?
你如何保证用完后关闭连接?

viena 2008-07-10
  • 打赏
  • 举报
回复
另有一疑问,
既然都是静态方法,为啥不用静态类?
还弄一个唯一实例做什么?这个对象做什么用的?
viena 2008-07-10
  • 打赏
  • 举报
回复
粗看了下,这些代码没有问题
看看你其它地方有没有用完没有关闭连接的地方?

110,998

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧