最近做了一个项目,需要用.NET(C#)连接MYSQL数据库,于是我在网上找到了MySql.Data.dll(5.0.9.0)组件来实现。在内网测试的时候一切正常,但到网站对外发布后问题产生了。。
具体问题是连接池已满(超过100+),程序拒绝再向数据库服务器发送请求。导致用户无法访问。
我在后台观察服务器的连接数发现,每一个访问的用户都会新建立一个进程,这个进程数只增不减,状态全是等待的连接……尝试的解决办法:
1、服务器端设置挂起超过30秒的连接用户强行T出,结果由于访问用户过多还是爆掉了。
2、在连接数据库的SQL语句上强行不使用连接池,即每个访问的用户都直接连接直数据库,这样一来问题虽然解决了,但是访问的速度明显降低了。连接数据库的代码如下,所有打开的conn都已经第一时间关闭了,程序其其它地方使用的da和ds也都已经Dispose()和=nullusing 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 MySql.Data.MySqlClient;namespace MySqlConn
{
    /// <summary>
    /// MySql_Conn 的摘要说明
    /// </summary>
    public class MySql_Conn
    {
        public static MySqlConnection NewDbConn()
        {
            string connectionString = "Database=xxxx;Server=xxxx;UID=xxxx;PWD=xxxx;Connect Timeout=30;charset=utf8";
            return new MySqlConnection(connectionString);
        }        public static MySqlConnection NewDbConnOpen()
        {
            MySqlConnection dbconn = NewDbConn();
            dbconn.Open();
            return dbconn;
        }        public MySqlDataReader GetSqlDr(string sql)
        {
            MySqlConnection dbconn = NewDbConnOpen();//打开数据库连接
            MySqlCommand da = dbconn.CreateCommand();
            da.CommandText = sql;
            da.CommandType = CommandType.Text;
            MySqlDataReader reader = null;
            try
            {
                reader = da.ExecuteReader(CommandBehavior.CloseConnection);
                //CommandBehavior.CloseConnection的意思是当这个dataread关闭时候把当前使用的数据库连接同时关闭
            }
            catch (Exception ex)
            {
                string s = ex.Message;
                reader = null;
            }
            da.Dispose();
            return reader;
            //返回一个DataRead
        }        public DataSet GetSqlDataSet(string sql)
        {
            MySqlConnection dbconn = NewDbConnOpen();
            DataSet ds = new DataSet();
            MySqlDataAdapter da = new MySqlDataAdapter(sql, dbconn);
            da.Fill(ds);
            dbconn.Close();
            return ds;
            //返回一个dataset用于快速绑定数据控件
        }
        public long RunSqlDatacmd(string sql)
        {
            MySqlConnection dbconn = NewDbConnOpen();
            MySqlCommand cmd = dbconn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;
            long ret = 0;
            try
            {
                if (cmd.Connection.State == ConnectionState.Broken)
                {
                    cmd.Connection.Close();
                    cmd.Connection.Open();
                }
                else if (cmd.Connection.State == ConnectionState.Closed)
                {
                    cmd.Connection.Open();
                }
                else if (cmd.Connection.State == ConnectionState.Open)
                {
                    ret = cmd.ExecuteNonQuery();
                }
                else
                {
                    ret = -102;
                }
            }
            catch (Exception ex)
            {
                string m = ex.Message;
                ret = -5;
            }
            cmd.Dispose();
            dbconn.Close();
            return ret;
        }
    }
}具体情况就是这样了,请遇到过同样问题的高手帮忙解决下。谢谢。

解决方案 »

  1.   

    你在你的连接字符串中设置这样一句Max Pool Size=1024;
    最大同时连接数1024 应该就好多了
    数据库可以同时连接32767个 
      

  2.   

    先close,再dispose.
    using(MySqlDataAdapter ds=   new   MySqlDataAdapter (sql,   conn))  
    看看
      

  3.   

    1. public static MySqlConnection NewDbConnOpen()
        {
            MySqlConnection dbconn = NewDbConn();
            dbconn.Open(); // 没有必要在这里Open
            return dbconn;
        }2. 增大连接池数量。看楼主的并发用户似乎很多,能不能考虑负载平衡
      

  4.   


    你好,谢谢,你的方法我倒没试过。服务器方面我不怎么了解,之前设置到最大后发现实际可用的只有1900多,但netstat -na发现连接用户到100+就崩溃了。。
    今天晚上把这条挂上,明天早上起来看看是否可行~3Q
      

  5.   

    解决了
    主要问题应该出在DataReader上吧,每一个连接都会占用一个线程。
    全部改成DataAdapter就解决了。。当然Max Pool Size=1024这个也有加~
    4楼说的地方我也改了。只是在每次打开数据库的时候才open,用完马上关掉。
    最后谢谢大家了。
      

  6.   

    MySql.Data.dll 的BUG,去官方下载吧。我已经解决了。有问题+我QQ:99748954