首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

connection这么创建的优缺点是什么

2012-08-17 
connection这样创建的优缺点是什么private static SqlConnection con/// summary/// 取得连接/// /sum

connection这样创建的优缺点是什么
private static SqlConnection con;

  /// <summary>
  /// 取得连接
  /// </summary>
  public static SqlConnection Connection
  {
  get
  {  
  string connectstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\GameCard_data.mdf;Integrated Security=True;User Instance=True";
  if (con == null)
  {
  con = new SqlConnection(connectstring);
  con.Open();
  }
  else if (con.State == ConnectionState.Broken)
  {
  con.Close();
  con.Open();
  }
  else if (con.State == ConnectionState.Closed)
  {
  con.Open();
  }
  return con;
  }
  }

[解决办法]

探讨
引用:
最致命的缺点,就是只有一个人能连接数据库。

为什么只有一个人能连接数据库??

[解决办法]
C# code
using System;using System.Data;using System.Data.SqlClient;using System.Threading;public partial class _Default : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        for (int i = 1; i <= 10; i++)        {            Response.Write("start:" + i.ToString());            new Thread(new ThreadStart(MyThread)).Start();        }        for (int i = 1; i <= 10; i++)        {            Response.Write("start:" + i.ToString());            new Thread(new ThreadStart(TestThread)).Start();        }    }    private static string connectstring = @"Data Source=127.0.0.1;Initial Catalog=XXXXXX;Persist Security Info=True;User ID=sa;Password=sa";    private static SqlConnection con;    /// <summary>    /// 取得连接    /// </summary>    public static SqlConnection Connection    {        get        {            if (con == null)            {                con = new SqlConnection(connectstring);                con.Open();            }            else if (con.State == ConnectionState.Broken)            {                con.Close();                con.Open();            }            else if (con.State == ConnectionState.Closed)            {                con.Open();            }            return con;        }    }    static void MyThread()    {        try        {            var sql = "SELECT * FROM table1";            SqlCommand cmd = new SqlCommand(sql, Connection);            SqlDataReader reader = cmd.ExecuteReader();            while (reader.Read())            {                Console.WriteLine(reader["mc"].ToString());            }            reader.Close();        }        catch (Exception ex)        {                 }    }    static void TestThread()    {        var sql = "SELECT * FROM table1";        using (SqlConnection myconn = new SqlConnection(connectstring))        {            myconn.Open();            SqlCommand cmd =new SqlCommand(sql,myconn);            SqlDataReader reader = cmd.ExecuteReader();            while (reader.Read())            {                Console.WriteLine(reader["mc"].ToString());            }            reader.Close();        }    }}
[解决办法]
缺点:
1.使用static,也就是全局能使用,如果有多线程,那么大家都来争这个资源,建议你可以在控制台中模拟多线程来测试一下,特别是两个线程几乎差不多时间进入此代码获取connection,你可以看看会怎样。
2.把connectstring放在代码里面,任何线程(用户)来调用的时候,都会产生新的字符串。这有点浪费内存


3.根据代码逻辑,如果con不为空,说明已经有人用过con了,所以,你判断是否Broken,但是如果不是Broken呢?比如另一个用户正在读取数据库,读到一半,而下一个用户拿着这个con去做别的事情,比如查询或者修改数据库操作或者执行存储过程,很可能会出异常
4..net里面有内置的连接池概念,而你这个思路我觉得是尽量使用一个连接,我觉得比较使用单机版的应用,最多一个人操作的。

优点: 从初学者来说,这种体现了封装思想,值得肯定。如果不是有很特殊的应用,是没必要这么做的,建议研究一下微软在数据库连接方面做了什么事情,连接池原理是怎样的,等你研究明白后,再重新看你这代码。

热点排行