我在WebService中创建数据库连接串!首先我会把连接串保存到一个静态变量中,例如:
  public static MySqlConnection myConn = new MySqlConnection(ConfigurationManager.AppSettings["CONN_STRING"]);然后我们在每个函数里面都开始
try
{
myConn.Open()
}catch
{
}
finally
{
myConn.Close()
}开进行数据库打开和关闭操作!我的问题是:如果多人同时访问的时候,是共享一个连接,还是每个人都是重新打开一个连接!
如果是前者,那么第一个人没有关闭的时候,那么第二人进来,肯定就会仍出异常出来?
我只所以想把连接串放到一个静态变量里面,因为WebService经常被调用,一般建立数据库连接都是很慢的!所以我希望是先建立一个连接放在那边!加快执行速度!请问一下是否合理

解决方案 »

  1.   

    但是有时会报这个错误,我感觉是不是,上个人处理这个函数没有结束!但是另外一个人又来访问这个函数,扔出来的错误(这仅是我的猜测)
    System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> The connection is already open
      

  2.   

    这样是不行的,两个线程冲突了,在开发WEB应用时,你已经“被多线程”了。
    这样做:public static string myConnString = ConfigurationManager.AppSettings["CONN_STRING"];public void MyWebMethod()
    {
        MySqlConnection myConn = new MySqlConnection(myConnString);
        myConn.Open();
        try 
        {
           ...
        }
        finally
        {
           myConn.Close();
        }
    }dotNet自己有连接池,会为你管理好这些连接的。
      

  3.   

    或者,你如果只想用一个连接,要这样:public static MySqlConnection myConn = new MySqlConnection ConfigurationManager.AppSettings["CONN_STRING"]);public void MyWebMethod()
    {
        lock(myConn)
        {
            try
            {
               ...
            }
            finally
            {
               ...
            }
        }
    }
      

  4.   

    看起来你对.net的连接机制是盲人。请去了解什么是“连接池”!每个程序段,自己打开的是一个逻辑连接,是连接池分配给它的一个链接。至于物理连接有多少个,你怎么知道?就算有1万人访问数据库,可能15个物理连接也足够了。
      

  5.   

    webservice应该不会有这个问题吧,
      

  6.   

    如果使用Lock的话,假设正在被Lock,那么第二个人进来是等待呢,还是异常?
      

  7.   


    当然是等待,所以用lock会导致效率的降低。