我写一个windows服务,创建了一个static conn的静态连接我这个windows服务有很多不同的线程同时调用这个conn对象假如不加锁和mutex等,同时访问这个conn,程序会不会出问题的?

解决方案 »

  1.   

    1: 肯定会有问题,主要是涉及到事务操作时,很可能会出现提交错乱、死锁!
    2:一般需要用连接池来解决,连接池很简单,只要在连接字符串加pool = true;
    3: 每次客户端清楚就分配一个connection给它,放心连接池会处理你担心的一切问题:
        a 连接对象缓存
        b 线程安全希望对你有启发!
      

  2.   

    只有你在线程创建connection,使用后关闭它就OK了,其他事情连接池搞定!
      

  3.   

    如果connection在线程代码中保证不关闭,是不会有问题的,至於说会有死锁什么的都扯淡。
      

  4.   

    1: 是静态Connection 对象,就是不同线程访问的都是同一Connection 对象。
    2: 线程a                         线程b
        con.begintrans  
        con.dosomething            
                                  con.begintrans    
                                  con.dosomething                                 
        con.committrans
                                  con.committrans
        想想会出现什么后果!
      

  5.   


    同步一下connection就行了啊!你说还有什么后果,你以前一根connection允许你异步开启几个事务啊?
      

  6.   


    看错了,不加锁或mutex是有问题。
      

  7.   

    你们的意思是不是这样,每次要访问数据库的时候都new一个conn?            using (SqlConnection conn = new SqlConnection(
      "Server=127.0.0.1;Database=gps_s1;uid=sa;pwd=235;Pooling=true;Max Pool Size=100;Min Pool Size=2;"))
                {
                    conn.Open();
                    //做自己东西
                    conn.Close();
                }
      

  8.   

    如果在一个页面应该没问题,不过用完后最好是close,因为一个open就要费不少资源,开的过多的话数据服务器就会当机.
      

  9.   

    楼上的,我的windows服务需要不断的操作数据库,一秒钟可能会查询几百次,我就怕不断的open和close影响性能,不知道我上面所发的连接池代码是否可行,能解决这个问题?         using (SqlConnection conn = new SqlConnection( 
      "Server=127.0.0.1;Database=gps_s1;uid=sa;pwd=235;Pooling=true;Max Pool Size=100;Min Pool Size=2;")) 
                { 
                    conn.Open(); 
                    //做自己东西 
                    conn.Close(); 
                }
      

  10.   

    补充一下,windows服务是一个长连接程序,不是像bs结构那样无状态,每次都有必要close的
      

  11.   

    1 不断的open和close不会影响性能,这些个问题连接池帮你搞定了
    2 连接池会保持一定水平的连接对象。
    3 第一次访问会创建一个或n个存入连接池,以后每次new SqlConnection,连接池根本就不创建,直接从连接池拿一个。
    4 conn.Close 不是真的释放了,而是和你访问线程脱离而已,它还保留在连接池,只是做了些状态恢复什么。