• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

超时时间已到,但是尚未从池中获取连接

qzw4549689 2010-04-21 03:36:06
问题:只要一打开读取数据库内容的页面就会出现“超时时间已到,但是尚未从池中获取连接”,而且是只打开一次的情况下,我已经检查过,没有没关闭的connection,和sqlDatareader.
看了下数据库连接数量,刚附加上去的数据库是0个活动连接,一访问页面立刻到了100个,调用的基本都是相同的存储过程,然后报“超时时间已到,但是尚未从池中获取连接”,不知道怎么回事,忘高手解决
...全文
713 点赞 收藏 18
写回复
18 条回复
meditatorx 2010年04月21日
把Web.config里的Max Pool Size和Pool Size调大一些
<appSettings>
<add key="Connection" value="Server=.;database=DB;uid=sa;pwd=sa;Min Pool Size=5;Max Pool Size=150;Connection Lifetime=180" />
</appSettings>
回复 点赞
meditatorx 2010年04月21日
如果你程序里的代码都有conn.Close();
那问题可能出在你的Webconfig文件里面
回复 点赞
vip__888 2010年04月21日
检查一下sql连接
回复 点赞
wuyq11 2010年04月21日
连接没关闭, 消耗资源过多
检查程序
using(sqlconnection conn=new sqlconnection(""))
检查访问量
回复 点赞
liuyileneal 2010年04月21日
看你这个,好多地方返回的都是datareader,这个是保持连接的。。确保你的页面也调用了dr.Close();
回复 点赞
liuyileneal 2010年04月21日
看你的页面调用这的函数是不是循环调用了
回复 点赞
g63263 2010年04月21日
高手们
高手们高手们高手们高手们高手们高手们高手们高手们高手们高手们高手们

回复 点赞
QQ30871740 2010年04月21日
检查你的数据库连接吧,估计问题在那
回复 点赞
qzw4549689 2010年04月21日
[Quote=引用 9 楼 mhymhycs 的回复:]
死循环了。。
[/Quote]
哪死循环了。。
回复 点赞
老爷子的单车 2010年04月21日
死循环了。。
回复 点赞
qzw4549689 2010年04月21日
[Quote=引用 6 楼 zhoufoxcn 的回复:]
引用 4 楼 qzw4549689 的回复:

我说过了,sqlconnection什么的都关了,dbhelper是一只在用的通用类

那还有一种可能,你的网站有上百万同时访问,那就需要设置Command.TimeOut,但是你的网站真有那么大的并发访问量吗?
[/Quote]
我在本机上测试,没访问量的担心
我的DBHelp,一直在用的

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace MaiDAL
{
public class DBHelp
{
public static SqlConnection sqlConnection;
public static SqlCommand sqlCommand;
public static SqlDataReader sqlDataReader;
public static string connString = ConfigurationManager.ConnectionStrings["connStr"].ToString();

/// <summary>
/// 根据存储过程读取数据,不带参数
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <returns>读取结果</returns>
public static SqlDataReader GetDataReader(string procName)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(procName, sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlConnection.Open();
return sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 根据存储过程读取数据,带参数
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="pars">存储过程参数</param>
/// <returns>读取结果</returns>
public static SqlDataReader GetDataReader(string procName, SqlParameter[] pars)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(procName, sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddRange(pars);
sqlConnection.Open();
return sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 根据存储过程执行命令(增 删 改),不带参数
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <returns>执行结果</returns>
public static bool ExcuteCommand(string procName)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(procName, sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlConnection.Open();
int result = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
return result > 0;
}

/// <summary>
/// 根据存储过程执行命令(增 删 改),带参数
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="pars">存储过程参数</param>
/// <returns>执行结果</returns>
public static bool ExcuteCommand(string procName, SqlParameter[] pars)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(procName, sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddRange(pars);
sqlConnection.Open();
int result = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
return result > 0;
}

/// <summary>
/// 通过sql语句读取数据,不带参数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static SqlDataReader GetDataReaderBySql(string sql)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(sql, sqlConnection);
sqlConnection.Open();
return sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 通过sql语句读取数据,带参数
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pars">参数数组</param>
/// <returns></returns>
public static SqlDataReader GetDataReaderBySql(string sql,SqlParameter[] pars)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(sql, sqlConnection);
sqlCommand.Parameters.AddRange(pars);
sqlConnection.Open();
return sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

/// <summary>
/// 根据sql语句执行命令(增 删 改),不带参数
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns></returns>
public static bool ExcuteCommandBySql(string sql)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(sql, sqlConnection);
sqlConnection.Open();
int result = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
return result > 0;
}

/// <summary>
/// 根据sql语句执行命令(增 删 改),带参数
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="pars">参数数组</param>
/// <returns></returns>
public static bool ExcuteCommandBySql(string sql, SqlParameter[] pars)
{
sqlConnection = new SqlConnection(connString);
sqlCommand = new SqlCommand(sql, sqlConnection);
sqlCommand.Parameters.AddRange(pars);
sqlConnection.Open();
int result = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
return result > 0;
}
}
}

回复 点赞
周公 2010年04月21日
记得,要确保及时出现异常也会关闭数据库连接。
回复 点赞
周公 2010年04月21日
[Quote=引用 4 楼 qzw4549689 的回复:]

我说过了,sqlconnection什么的都关了,dbhelper是一只在用的通用类
[/Quote]
那还有一种可能,你的网站有上百万同时访问,那就需要设置Command.TimeOut,但是你的网站真有那么大的并发访问量吗?
回复 点赞
周公 2010年04月21日
使用存储过程的话:

/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="info">用户实体</param>
/// <returns></returns>
public bool Update(UserInfo info)
{
string sql = "MyProcedure";//存储过程名字
SqlParameter[] paramters = new SqlParameter[]{
new SqlParameter("@UserName",info.UserName),
new SqlParameter("@RealName",info.RealName),
new SqlParameter("@Age",info.Age),
new SqlParameter("@Sex",info.Sex),
new SqlParameter("@Mobile",info.Mobile),
new SqlParameter("@Email",info.Email),
new SqlParameter("@Phone",info.Phone),
new SqlParameter("@UserID",info.UserId),
};
SqlDbHelper db = new SqlDbHelper();
//CommandType.StoredProcedure表示使用存储过程
return db.ExecuteNonQuery(sql, CommandType.StoredProcedure, paramters) > 0;
}
回复 点赞
qzw4549689 2010年04月21日
我说过了,sqlconnection什么的都关了,dbhelper是一只在用的通用类
回复 点赞
周公 2010年04月21日
用法示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace ADODoNETDemo
{
/// <summary>
/// 用ADO.NET实现CRUD功能
/// </summary>
public class ADODotNetCRUD
{
/// <summary>
/// 统计用户总数
/// </summary>
/// <returns></returns>
public int Count()
{
string sql = "select count(1) from UserInfo";
SqlDbHelper db = new SqlDbHelper();
return int.Parse(db.ExecuteScalar(sql).ToString());
}
/// <summary>
/// 创建用户
/// </summary>
/// <param name="info">用户实体</param>
/// <returns></returns>
public bool Create(UserInfo info)
{
string sql = "insert UserInfo(UserName,RealName,Age,Sex,Mobile,Email,Phone)values(@UserName,@RealName,@Age,@Sex,@Mobile,@Email,@Phone)";
SqlParameter[] paramters = new SqlParameter[]{
new SqlParameter("@UserName",info.UserName),
new SqlParameter("@RealName",info.RealName),
new SqlParameter("@Age",info.Age),
new SqlParameter("@Sex",info.Sex),
new SqlParameter("@Mobile",info.Mobile),
new SqlParameter("@Email",info.Email),
new SqlParameter("@Phone",info.Phone),
};
SqlDbHelper db = new SqlDbHelper();
return db.ExecuteNonQuery(sql, CommandType.Text, paramters) > 0;
}
/// <summary>
/// 读取用户信息
/// </summary>
/// <param name="userId">用户编号</param>
/// <returns></returns>
public UserInfo Read(int userId)
{
string sql = "select * from UserInfo Where UserId="+userId;
SqlDbHelper db = new SqlDbHelper();
DataTable data = db.ExecuteDataTable(sql);
if (data.Rows.Count > 0)
{
DataRow row = data.Rows[0];
UserInfo info = new UserInfo()
{
UserId=int.Parse(row["UserId"].ToString()),
UserName=row["UserName"].ToString(),
Age=byte.Parse(row["Age"].ToString()),
Email=row["Email"].ToString(),
Mobile=row["Mobile"].ToString(),
Phone=row["Phone"].ToString(),
RealName=row["RealName"].ToString(),
Sex=bool.Parse(row["Sex"].ToString())
};
return info;
}
else
{
return null;
}
}
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="info">用户实体</param>
/// <returns></returns>
public bool Update(UserInfo info)
{
string sql = "update UserInfo set UserName=@UserName,RealName=@RealName,Age=@Age,Sex=@Sex,Mobile=@Mobile,Email=@Email,Phone=@Phone where UserID=@UserID";
SqlParameter[] paramters = new SqlParameter[]{
new SqlParameter("@UserName",info.UserName),
new SqlParameter("@RealName",info.RealName),
new SqlParameter("@Age",info.Age),
new SqlParameter("@Sex",info.Sex),
new SqlParameter("@Mobile",info.Mobile),
new SqlParameter("@Email",info.Email),
new SqlParameter("@Phone",info.Phone),
new SqlParameter("@UserID",info.UserId),
};
SqlDbHelper db = new SqlDbHelper();
return db.ExecuteNonQuery(sql, CommandType.Text, paramters) > 0;
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="userId">用户编号</param>
/// <returns></returns>
public bool Delete(int userId)
{
string sql = "delete from UserInfo where UserId=" + userId;
SqlDbHelper db = new SqlDbHelper();
return db.ExecuteNonQuery(sql) > 0;
}
/// <summary>
/// 获取用户表中编号最大的用户
/// </summary>
/// <returns></returns>
public int GetMaxUserId()
{
string sql = "select max(userId) from UserInfo";
SqlDbHelper db = new SqlDbHelper();
return int.Parse(db.ExecuteScalar(sql).ToString());
}
}
}
回复 点赞
周公 2010年04月21日
[Quote=引用楼主 qzw4549689 的回复:]
问题:只要一打开读取数据库内容的页面就会出现“超时时间已到,但是尚未从池中获取连接”,而且是只打开一次的情况下,我已经检查过,没有没关闭的connection,和sqlDatareader.
看了下数据库连接数量,刚附加上去的数据库是0个活动连接,一访问页面立刻到了100个,调用的基本都是相同的存储过程,然后报“超时时间已到,但是尚未从池中获取连接”,不知道怎么回事,忘高手解决
[/Quote]
因为你每次操作数据库,Connection.Open()却没有关闭,应该在调用关闭之后马上关闭,可以考虑使用using:
下面是一个例子:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace ADODoNETDemo
{
/// <summary>
/// 针对SQL Server数据库操作的通用类
/// 作者:周公
/// 日期:2009-01-08
/// Version:1.0
/// </summary>
public class SqlDbHelper
{
private string connectionString;
/// <summary>
/// 设置数据库连接字符串
/// </summary>
public string ConnectionString
{
set { connectionString = value; }
}
/// <summary>
/// 构造函数
/// </summary>
public SqlDbHelper()
: this(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString)
{

}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
public SqlDbHelper(string connectionString)
{
this.connectionString = connectionString;
}
/// <summary>
/// 执行一个查询,并返回结果集
/// </summary>
/// <param name="sql">要执行的查询SQL文本命令</param>
/// <returns>返回查询结果集</returns>
public DataTable ExecuteDataTable(string sql)
{
return ExecuteDataTable(sql, CommandType.Text, null);
}
/// <summary>
/// 执行一个查询,并返回查询结果
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <returns>返回查询结果集</returns>
public DataTable ExecuteDataTable(string sql, CommandType commandType)
{
return ExecuteDataTable(sql, commandType, null);
}
/// <summary>
/// 执行一个查询,并返回查询结果
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
/// <returns></returns>
public DataTable ExecuteDataTable(string sql, CommandType commandType, SqlParameter[] parameters)
{
DataTable data = new DataTable();//实例化DataTable,用于装载查询结果集
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;//设置command的CommandType为指定的CommandType
//如果同时传入了参数,则添加这些参数
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
//通过包含查询SQL的SqlCommand实例来实例化SqlDataAdapter
SqlDataAdapter adapter = new SqlDataAdapter(command);

adapter.Fill(data);//填充DataTable
}
}
return data;
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的查询SQL文本命令</param>
/// <returns></returns>
public SqlDataReader ExecuteReader(string sql)
{
return ExecuteReader(sql, CommandType.Text, null);
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <returns></returns>
public SqlDataReader ExecuteReader(string sql, CommandType commandType)
{
return ExecuteReader(sql, commandType, null);
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
/// <returns></returns>
public SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(sql, connection);
//如果同时传入了参数,则添加这些参数
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();
//CommandBehavior.CloseConnection参数指示关闭Reader对象时关闭与其关联的Connection对象
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的查询SQL文本命令</param>
/// <returns></returns>
public Object ExecuteScalar(string sql)
{
return ExecuteScalar(sql, CommandType.Text, null);
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <returns></returns>
public Object ExecuteScalar(string sql, CommandType commandType)
{
return ExecuteScalar(sql, commandType, null);
}
/// <summary>
///
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
/// <returns></returns>
public Object ExecuteScalar(string sql, CommandType commandType, SqlParameter[] parameters)
{
object result = null;
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;//设置command的CommandType为指定的CommandType
//如果同时传入了参数,则添加这些参数
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();//打开数据库连接
result = command.ExecuteScalar();
}
}
return result;//返回查询结果的第一行第一列,忽略其它行和列
}
/// <summary>
/// 对数据库执行增删改操作
/// </summary>
/// <param name="sql">要执行的查询SQL文本命令</param>
/// <returns></returns>
public int ExecuteNonQuery(string sql)
{
return ExecuteNonQuery(sql, CommandType.Text, null);
}
/// <summary>
/// 对数据库执行增删改操作
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <returns></returns>
public int ExecuteNonQuery(string sql, CommandType commandType)
{
return ExecuteNonQuery(sql, commandType, null);
}
/// <summary>
/// 对数据库执行增删改操作
/// </summary>
/// <param name="sql">要执行的SQL语句</param>
/// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
/// <param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
/// <returns></returns>
public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)
{
int count = 0;
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.CommandType = commandType;//设置command的CommandType为指定的CommandType
//如果同时传入了参数,则添加这些参数
if (parameters != null)
{
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
connection.Open();//打开数据库连接
count = command.ExecuteNonQuery();
}
}
return count;//返回执行增删改操作之后,数据库中受影响的行数
}
/// <summary>
/// 返回当前连接的数据库中所有由用户创建的数据库
/// </summary>
/// <returns></returns>
public DataTable GetTables()
{
DataTable data = null;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();//打开数据库连接
data = connection.GetSchema("Tables");
}
return data;
}

}
}
回复 点赞
sxiaohui8709253 2010年04月21日
cmd.timeout 设置这个?
connectionstring中加上 maxpollsize=512
所有执行数据库操作的方法 执行完都要关闭连接
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告