Discuz!NT官方社区

首页 » Discuz!NT交流与讨论 » BUG 反馈 » 大家好,关于NT DISCUZ 的MYSQL部分
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后又恢复正常了。。。。

急待高人解救。。。。。
旭雨 - 2007-12-24 9:14:00
你把你的MSN号发上来,我加你!
ijsp - 2007-12-29 16:20:00
汗,我从不用MSN,只用QQ:85686916
SummerSky - 2008-1-1 10:51:00
那就装一个MSN吧:D
ijsp - 2008-1-2 12:43:00
汗,呵呵。。。。。。。。。。。。。。。
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 的不,给点经验吧,或者给个源码看看也行,谢啦
1
查看完整版本: 大家好,关于NT DISCUZ 的MYSQL部分