首页 新闻 会员 周边

超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小

0
悬赏园豆:20 [已解决问题] 解决于 2012-12-28 13:35

 

图片的提示就是“超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小”

知道是某个数据没关闭,可是我在很多地方加了close还是不行 有些地方加了会提示检测到无法访问代码,鼠标移到ExecuteReader会提示System.InvalidOperationException System.Data.SqlClient.SqlException异常的信息。

 

代码:

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;

public class dataOperate
{
    public  SqlConnection con;
    public dataOperate()
    {
    }
    public  bool execSQL(string sql)
    {
        SqlConnection con = createCon();
        con.Open();
        SqlCommand com = new SqlCommand(sql, con);
        try
        {
            com.ExecuteNonQuery();
            con.Close();
        }
        catch (Exception e)
        {
            con.Close();
            return false;
        }
        return true;
    }
    public  int seleSQL(string sql)
    {
        SqlConnection con = createCon();
        con.Open();
        SqlCommand com = new SqlCommand(sql, con);
        try
        {
          return Convert.ToInt32(com.ExecuteScalar());
        }
        catch (Exception e)
        {
            CloseDB();
            return 0;
        }
    }
    public  DataSet getDataset(string sql, string table)
    {
        using (SqlConnection con = createCon())
        {
            con.Open();
            DataSet ds;
            SqlDataAdapter sda = new SqlDataAdapter(sql, con);
            ds = new DataSet();
            sda.Fill(ds, table);
            return ds;
        }
 
    }
      public SqlDataReader ExceRead(string sql)
    {
        SqlConnection con = createCon();
        con.Open();
        SqlCommand com = new SqlCommand(sql, con);
        SqlDataReader read = com.ExecuteReader();
        return read;
    }
       public  SqlConnection createCon()
    {
        con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConStr"].ToString()); 
             return con;
    }
    public void CloseDB()
    {
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
    }
}

 

 

我在web.configl里加了个

<connectionStrings>
      <add name="ConStr" connectionString="server=.;database=wz;uid=sa;pwd=;" />
 </connectionStrings>

如果在这里加个Max Pool Size=512 这样治标不治本而且会损坏系统性能  请问有什么好的方法吗

Coral_修的主页 Coral_修 | 初学一级 | 园豆:177
提问于:2012-12-26 16:11
< >
分享
最佳答案
0

你上面的代码是不是调用的sqlhelper?你的系统是一开始就报错还是,运行一段时间后报错?

收获园豆:10
唯吴独尊 | 小虾三级 |园豆:707 | 2012-12-26 16:56

 没有调用sqlhelper  运行一会儿后报错  直接在asp.net下运行都可以的 只有在IIS里运行的时候 会出错

Coral_修 | 园豆:177 (初学一级) | 2012-12-26 16:59

@Coral_修: 那就是因为你用了 SqlDataReader这个函数,这里跟你简单说下,因为要下班了, SqlDataReader你把这个想成是服务器的指针,你用完了,没有释放,占用资源多了,就报错了。如果你项目不大的话,用dataset或是是用model层来映射。如果你不想改代码的话,那需要修改一下web.config里面的链接语句,但是这个事牺牲服务器的性能来换取你的网站的运行。具体代码你百度一下sqlhelper 什么类的。我以前配到过,就半天报错!

唯吴独尊 | 园豆:707 (小虾三级) | 2012-12-26 17:05

@唯吴独尊: 我在每段代码 标有close的后面加了个  System.GC.Collect(); 就可以运行了

Coral_修 | 园豆:177 (初学一级) | 2012-12-27 09:46
其他回答(4)
0

你这代码写的太差了,根本就没法改,因为看不出你到底为什么要这样做。

Launcher | 园豆:45045 (高人七级) | 2012-12-26 16:25

呃....

支持(0) 反对(0) Coral_修 | 园豆:177 (初学一级) | 2012-12-26 16:26

@Coral_修:那你有没有正常的代码啊

支持(0) 反对(0) Coral_修 | 园豆:177 (初学一级) | 2012-12-26 16:29
0

LZ最好能在finally中close()或者直接使用using关键字。还有用了using 就不需要close了。代码太乱了。建议楼主看一看,《代码整洁之道》之类的书籍。

收获园豆:3
kklin | 园豆:203 (菜鸟二级) | 2012-12-26 16:54

 没有调用sqlhelper  运行一会儿后报错  直接在asp.net下运行都可以的 只有在IIS里运行的时候 会出错

支持(0) 反对(0) Coral_修 | 园豆:177 (初学一级) | 2012-12-26 17:00

代码稍微修改了一下 

支持(0) 反对(0) Coral_修 | 园豆:177 (初学一级) | 2012-12-26 17:00
0

图挂了,

你的SqlDataReader 没有dispose,不满才怪。

你的数据库的操作,没有一个try catch finally。肯定不行的

收获园豆:7
chenping2008 | 园豆:9836 (大侠五级) | 2012-12-26 17:05
0

图片不能显示,麻烦上传一下图片

博客园团队 | 园豆:5329 (大侠五级) | 2012-12-26 20:35

图片的提示就是:超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小

支持(0) 反对(0) Coral_修 | 园豆:177 (初学一级) | 2012-12-26 20:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册