最近做了一个项目,需要用.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;
}
}
}具体情况就是这样了,请遇到过同样问题的高手帮忙解决下。谢谢。
具体问题是连接池已满(超过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;
}
}
}具体情况就是这样了,请遇到过同样问题的高手帮忙解决下。谢谢。
最大同时连接数1024 应该就好多了
数据库可以同时连接32767个
using(MySqlDataAdapter ds= new MySqlDataAdapter (sql, conn))
看看
{
MySqlConnection dbconn = NewDbConn();
dbconn.Open(); // 没有必要在这里Open
return dbconn;
}2. 增大连接池数量。看楼主的并发用户似乎很多,能不能考虑负载平衡
你好,谢谢,你的方法我倒没试过。服务器方面我不怎么了解,之前设置到最大后发现实际可用的只有1900多,但netstat -na发现连接用户到100+就崩溃了。。
今天晚上把这条挂上,明天早上起来看看是否可行~3Q
主要问题应该出在DataReader上吧,每一个连接都会占用一个线程。
全部改成DataAdapter就解决了。。当然Max Pool Size=1024这个也有加~
4楼说的地方我也改了。只是在每次打开数据库的时候才open,用完马上关掉。
最后谢谢大家了。