读书人

.net链接MySql数据库运行一会儿后总

发布时间: 2012-03-18 13:55:39 作者: rapoo

【急】.net链接MySql数据库,运行一会儿后总是出现Timeout expired.错误,我无奈了,大家帮帮忙,谢谢拉!!!
我用.net链接mysql数据库,网站运行一段时间后总是出现Timeout expired错误,从网上查了查说是数据连接用完后没有关闭,可是我怎么找都没有找到哪里没关闭,大家帮帮忙,我把我的MySQLHelper.cs类发上来,大家帮我看看吧,谢了!真的很急!!!

C# code
using System;using System.Collections;using System.Data;//using System.Data.SqlClient;using MySql.Data.MySqlClient;using System.Collections.Generic;using System.Configuration;namespace DAL{    public static class MySQLHelper    {        //数据库连接字符串。        //连接字符串在界面层的webConfig的配置文件中。[设计为public是为了创建带事务的连接,因为连接将在DAL相关类中创建]        private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["qkzx"].ConnectionString;        private static MySqlConnection sqlcon = null;        private static MySqlCommand sqlcmd = null;        #region 执行SQL语句或存储过程,返回影响的行数        /// <summary>        /// 执行SQL语句或存储过程,返回影响的行数        /// </summary>        /// <param name="commandType">命令类型(存储过程, 文本, 表或视图)</param>        /// <param name="commandText">存储过程名称或者sql命令语句</param>        /// <param name="commandParameters">执行命令所用参数的集合</param>        /// <returns>执行命令所影响的行数</returns>        public static int ExecuteNonQuery(CommandType commandType, string commandText, params MySqlParameter[] commandParameters)        {            MySqlCommand command = new MySqlCommand();            using (MySqlConnection connection = new MySqlConnection(ConnectionString))            {                //为什么要调用准备执行命令这个方法:因为在此处可以加入一个事务控制。                PrepareCommand(command, connection, commandType, commandText, commandParameters);                int val = command.ExecuteNonQuery();                command.Parameters.Clear();                return val;            }        }        #endregion        #region 执行一个返回读取器的sql命令        /// <summary>        /// 用执行的数据库连接执行一个返回读取器的sql命令        /// </summary>        /// <param name="commandType">命令类型(存储过程, 文本, 等等)</param>        /// <param name="commandText">存储过程名称或者sql命令语句</param>        /// <param name="commandParameters">执行命令所用参数的集合</param>        /// <returns>包含结果的读取器</returns>        public static MySqlDataReader ExecuteGetReader(CommandType commandType, string commandText, params MySqlParameter[] commandParameters)        {            //创建一个SqlCommand对象            MySqlCommand command = new MySqlCommand();                   MySqlConnection connection = new MySqlConnection(ConnectionString);            //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在,            //因此commandBehaviour.CloseConnection 就不会执行            try            {                //调用 PrepareCommand 方法,对 SqlCommand 对象设置参数                PrepareCommand(command, connection, commandType, commandText, commandParameters);                //调用 SqlCommand  的 ExecuteReader 方法                MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);                //清除参数                command.Parameters.Clear();                return reader;  //注意不能关闭连接,否则调用方无法读取数据。            }            catch            {                //关闭连接,抛出异常                connection.Close();                throw;            }                   }        #endregion        #region 执行命令,返回DataTable        /// <summary>        /// 执行命令,返回DataTable        /// </summary>        /// <param name="commandText">命令内容</param>        /// <param name="commandType">命令类型</param>        /// <param name="commandParameters">参数</param>        /// <returns>DataTable数据表</returns>        public static DataTable ExecuteGetDataTable(CommandType commandType, string commandText, params MySqlParameter[] commandParameters)        {            MySqlCommand command = new MySqlCommand();            DataTable table = new DataTable();            using (MySqlConnection connection = new MySqlConnection(ConnectionString))            {                PrepareCommand(command, connection, commandType, commandText, commandParameters);                MySqlDataAdapter adapter = new MySqlDataAdapter(command);                adapter.Fill(table);                return table;            }        }        #endregion        #region 执行一个命令并返回第一列        /// <summary>        /// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列        /// </summary>        ///<param name="ConnectionString">一个有效的连接字符串</param>        /// <param name="commandType">命令类型(存储过程, 文本, 等等)</param>        /// <param name="commandText">存储过程名称或者sql命令语句</param>        /// <param name="commandParameters">执行命令所用参数的集合</param>        /// <returns>用 Convert.To{Type}把类型转换为想要的 </returns>        public static object ExecuteScalar(CommandType commandType, string commandText, params MySqlParameter[] commandParameters)        {            MySqlCommand command = new MySqlCommand();            using (MySqlConnection connection = new MySqlConnection(ConnectionString))            {                PrepareCommand(command, connection, commandType, commandText, commandParameters);                object val = command.ExecuteScalar();                command.Parameters.Clear();                return val;            }        }        #endregion        #region 准备执行一个命令        /// <summary>        /// 准备执行一个命令        /// </summary>        /// <param name="cmd">sql命令</param>        /// <param name="conn">Sql连接</param>        /// <param name="cmdType">命令类型例如 存储过程或者文本</param>        /// <param name="cmdText">命令文本</param>        /// <param name="cmdParms">执行命令的参数</param>        private static void PrepareCommand(MySqlCommand command, MySqlConnection connection, CommandType commandType, string commandText, MySqlParameter[] commandParameters)        {            if (connection.State != ConnectionState.Open)            {                connection.Open();            }            command.Connection = connection;            command.CommandText = commandText;            command.CommandType = commandType;            if (commandParameters != null)                command.Parameters.AddRange(commandParameters);        }        #endregion    }} 



[解决办法]
private static MySqlConnection sqlcon = null;

去掉static

在不行 把其他 static 也去掉
[解决办法]
需要注意的如果数据库连接做成静态,很容易出问题,因为web程序并发的情况是很常见的,经常a用户在用数据库连接访问数据库,用完了关闭连接,而b正好也在用,还没用完,就被a关闭了,导致b用户出错了

所以数据库操作一类最好不要用静态变量,可以用静态方法,在方法里动态创建连接
当前,你用静态变量,然后通过锁定也可以,但是会影响别的用户的访问效率

什么情况下要使用静态方法,如果你的方法不需要运行时的某些状态,也不需要保存运行时的状态,就可以设计成静态方法,比如你说的ExecuteNonQuery就可以设计成静态方法,因为它可以通过一个sql和数据库连接,返回一个数据集
其实什么时候用静态方法,不能一概而论,这跟具体的项目需求有关


[解决办法]
Conncetion不能用静态变量,应改为实例变量。

读书人网 >asp.net

热点推荐