關於多線程操作數據庫手記


入博客園還是第一次自己寫原創帖子.在博客園也學習到了挺多東西..這幾天在做采集器的時候.涉及到了多線程.自己的博客園的博客也是關於網絡蜘蛛的文章或者是正則表達式.以前教師教過我們多線程,.當時自己沒動手.這次動手運到到了許多問題.一個就是線程池...等.在多線程操作數據庫的時候一個問題糾結了哦.就是多線程的話.他們就是搶占資源來進行數據處理.那么在打開同一個數據庫的時候另外一個線程也在用...導致程序執行到一部分的時候就報錯了 無法繼續執行了.

在網上看到兩個辦法
1共用一個連接就可以

通用一個數據庫連接文件(我沒用這個)
2其實一樣可以用lock實現,把數據庫操作寫成一個函數,函數內加lock。c#會安排他們排隊
比如
private static object privateObjectLock = new object();
public static xxoo()
{
lock(privateObjectLock)
{
//數據操作語句
}
}
}
你在一個函數里實現數據庫操作。然后線程操作數據庫都調用他

你在一個函數里實現數據庫操作。然后線程操作數據庫都調用他
  public   void   Function()  
  {  
          System.Object   lockThis   =   new   System.Object();  
          lock(lockThis)  
          {  
                  //   Access   thread-sensitive   resources.  
          }  
  }   
  提供給   lock   關鍵字的參數必須為基於引用類型的對象,該對象用來定義鎖的范圍。在上例中,鎖的范圍限定為此函數,因為函數外不存在任何對該對象的引用。嚴格地說,提供給   lock   的對象只是用來唯一地標識由多個線程共享的資源,所以它可以是任意類實例。然而,實際上,此對象通常表示需要進行線程同步的資源。例如,如果一個容器對象將被多個線程使用,則可以將該容器傳遞給   lock,而   lock   后面的同步代碼塊將訪問該容器。只要其他線程在訪問該容器前先鎖定該容器,則對該對象的訪問將是安全同步的。  
   
  通常,最好避免鎖定   public   類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則   lock(this)   可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出於同樣的原因,鎖定公共數據類型(相比於對象)也可能導致問題。鎖定字符串尤其危險,因為字符串被公共語言運行庫   (CLR)“暫留”。這意味着整個程序中任何給定字符串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字符串上放置了鎖,就將鎖定應用程序中該字符串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。某些類提供專門用於鎖定的成員。例如,Array   類型提供   SyncRoot。許多集合類型也提供   SyncRoot。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM