ijsp - 2007-12-19 21:51:00
大家好,关于NT DISCUZ 的MYSQL部分
偶的网站 ASP.NET2.0 + MYSQL ,数据库驱动用的是 MYSQL官方的 connect/net 5.1.4
最近发现效率比较低,数据库连接线程总是在一百以上。。。。。程序中我一直注意了关闭数据库连接。。。。网上找了很多资料,改了很多次,效果还是不理想。。。。
一直想看看NT DISCUZ MYSQL 版的数据库交互模块是怎么写的,可惜至今没开源此版,哎。。。。
现在此发贴,并发布自己的源码,请大家指点下,或者提供NT DISCUZ MYSQL 模块代码给我学习下,不胜感激。。。。。。
这几天我在网上看完仅有的几篇MYSQL+ASP.NET的原创文章后,现将改写后的代码COPY出来,请各位朋友看看,还需要怎么优化或改进(只实现 select update delete 之类的普通操作即可),谢谢大家
============数据库操作类
namespace ijsp
{
using MySql.Data.MySqlClient;
using System;
using System.Data;
/// <summary>
/// MysqlConbean 的摘要说明
/// </summary>
public class MysqlConbean
{
private static String URLS = "server=localhost;user id=xxx;password=xxx;database=xxx;charset=gb2312";
private static MySqlConnection conn = new MySqlConnection(URLS); //创建SQL连接
private static MySqlDataReader dr; //创建SQL数据读取器
private static MySqlCommand comm; //创建SQL命令对象
//private static MySqlDataAdapter da; //创建SQL数据适配器
//private static MySqlParameter param; //创建SQL参数
//private static DataSet ds; //创建数据集
//private static DataView dv; //创建视图
public MysqlConbean()
{
// TODO: 在此处添加构造函数逻辑
}
/// <summary>
/// 打开数据库连接
/// </summary>
private static void Open()
{
try
{
if (conn.State == ConnectionState.Closed) conn.Open();//该方法可以获得MYSQL连接状态,但在以前的mysql-connector-net-5.0中会报错,现在的5.1.4不报错,不知是不是我以前记错或用错了
}
catch (Exception) { };
}
/// <summary>
/// //提供此方法以便在ASPX页面中通过 ijsp.MysqlConbean.connStateget() 获得连接的状态
/// </summary>
public static string connStateget()
{
string states = "未知";
try
{
if (conn.State == ConnectionState.Closed) states = "conn closed";
if (conn.State == ConnectionState.Open) states = "conn open";
}
catch (Exception) { };
return states;
}
/// <summary>
/// 关闭数据库连接:在ASPX页面调用完数据库后,调用此方法进一步释放连接或资源,对于偶这菜鸟来说,这个方法的中代码可能有些多余或重复,只要能释放相关数据库资源在所不惜。。。
/// </summary>
public static void Close()
{
try
{
if (conn != null ¦ ¦ conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
catch (Exception) { }
//再加个comm,不知是不是多余
try
{
comm.Dispose();
}
catch (Exception) { }
//再来个MySqlDataReader的
try
{
if (dr != null ¦ ¦ !dr.IsClosed) //释放资源
{
dr.Close();
dr.Dispose();
}
}
catch (Exception) { }
}
/// <summary>
/// 获得MySqlDataReader对象 使用完须关闭数据库连接
/// </summary>
/// <param name="sql"> 执行普通sql查询语句 </param>
/// <returns> </returns>
public static MySqlDataReader ReturnDateReader(string sql)
{
Open();
try
{
comm = new MySqlCommand(sql, conn);
dr = comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//这里直接用 return comm.ExecuteReader(System.Data.CommandBehavior.CloseConnection);来代替 return dr; 会好点么?
return dr;
}
catch (Exception)
{
Close();
return dr;
}
}
/// <summary>
/// ReturnExeNoQuery语句,返回一个整数
/// </summary>
/// <param name="sql"> 执行Sql 更新,删除,插入等无需返回结果的语句 </param>
public static int ReturnExeNoQuery(string sql)
{
Open();
try
{
comm = new MySqlCommand(sql, conn);
int enq = comm.ExecuteNonQuery();
try
{
comm.Cancel();//这个MySqlCommand.Cancel 是 mysql-connector-net-5.1.4 中新增的,作用不明,请高手指点
comm.Dispose();
}
catch (Exception) { };
Close();
return enq;//提供一个参数给ASPX以判断操作是否成功
}
catch (Exception)
{
Close();
return -1;
}
}
public static void MyClose()
//与上面的 Close 完全一样,只是方法名不同
{
try
{
if (conn != null ¦ ¦ conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
catch (Exception) { }
try
{
comm.Dispose();
}
catch (Exception) { }
try
{
if (dr != null ¦ ¦ !dr.IsClosed) //释放资源
{
dr.Close();
dr.Dispose();
}
}
catch (Exception) { }
}
}
}
ijsp - 2007-12-19 21:51:00
==========================分页类
namespace ijsp
{
using MySql.Data.MySqlClient;
using System;
public class MysqlDBpage
{
public static int allpage = 1;
public static int allrow = 1;
public static int i = 0;
public static int pagerow = 1;
private static int startrow = 0;
public static int thispage = 1;
/// <summary>
/// 与MysqlConbean配合实现分页
/// </summary>
/// <param name="s1"> 查总记录条数,即count(*) </param>
/// <param name="s2"> 用来查询欲显示的数据 </param>
/// <param name="s3"> 获得用户输入的页码 </param>
/// <param name="s4"> 每页显示记录数 </param>
public static MySqlDataReader mysqlpage(string s1, string s2, string s3, string s4)
{
MySqlDataReader reader = MysqlConbean.ReturnDateReader(s1);
if (reader.Read())
{
allrow = Convert.ToInt32(reader[0]);
}
allpage = ((allrow + pagerow) - 1) / pagerow;
reader.Close();
//reader.Dispose();
MysqlConbean.Close();
try
{
thispage = Convert.ToInt32(s3);
}
catch (Exception)
{
thispage = 1;
}
if (thispage > allpage)
{
thispage = allpage;
}
if (thispage < 1)
{
thispage = 1;
}
try
{
pagerow = Convert.ToInt16(s4);
}
catch (Exception)
{
pagerow = 10;
}
startrow = (thispage - 1) * pagerow;
if (thispage > = 1)
{
i = (thispage * pagerow) - pagerow;
}
s2 = string.Concat(new object[] { s2, " limit ", startrow, ",", s4 });
return MysqlConbean.ReturnDateReader(s2);
}
public static void Closemysqlpage()
{
MysqlConbean.Close();
}
public static void Close()
{
MysqlConbean.Close();
}
}
}
旭雨 - 2007-12-21 13:50:00
LZ写的不错,支持一下,开源后您可以研究一下数据库方法!!
ijsp - 2007-12-21 22:09:00
哎,偶菜鸟。。。。
现在的代码还是不行。。。。
偶菜鸟来的。。。。
现在的Threads_connectd 一般还是在120~200左右
网站一般几小时后访问MYSQL的页面就会打不开,或者404。。。哎。。。。
重新上传上面代码封装的DLL后又恢复正常了。。。。
急待高人解救。。。。。
ijsp - 2007-12-29 16:20:00
汗,我从不用MSN,只用QQ:85686916
SummerSky - 2008-1-1 10:51:00
那就装一个MSN吧:D
ijsp - 2008-1-23 15:53:00
Aborted_clients 14
Aborted_connects 58
Table_locks_immediate 16526
Table_locks_waited 1
Tc_log_max_pages_used 0
Tc_log_page_size 0
Tc_log_page_waits 0
Threads_cached 3
Threads_connected 37
Threads_created 41
Threads_running 1
Uptime 543
数据库连接问题还没解决,再次求救来了。。。。mysql >show status 的数据如上,太可怕了呜呜。。。。
ijsp - 2008-1-27 13:24:00
改了很多次,效果不理想,DISCUZ的源代码由于 MSSQL MYSQL 及AC 三个数据库支持,有些代码不是针对MYSQL的,偶没看明白,理不出单独的DLL,现在改用 MYSQL 数据交互组件中的 MysqlHelper 了,不过MysqlHelper 有个问题,就是它的
MySqlHelper.ExecuteReader
MySqlHelper.ExecuteNonQuery
都是直接传给个数据库连接字符串进去,注意,是STRING,也就是说,我没法手动控制
MySqlHelper的 MySqlConnection 了,因为你不可能对 string 执行 Open() Close() 呀呵呵
哪位朋友有用 MySqlHelper 的不,给点经验吧,或者给个源码看看也行,谢啦