當前位置:首頁 » 文件傳輸 » 多線程訪問大量數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

多線程訪問大量數據

發布時間: 2023-03-12 04:02:51

Ⅰ java多線程訪問資料庫怎麼優化啊,並發很大

個人覺得高寫入並發的話先用緩存緩沖一下,可以合並的寫入合並成批量寫入可以管一些用但終歸寫入量很大的話還是要在資料庫端優化了,把並發寫均衡到多台伺服器上,應該沒有別的辦法了。如果瓶頸不再資料庫那就是應用伺服器處理能力不足,升級應用伺服器。

Ⅱ 多線程訪問同一個資料庫,需要加鎖么

多線程訪問資料庫,其中有一個線程會長時間佔用資料庫。這個線程是獨立線程,另外有一個線程池也會訪問資料庫,這個線程池中的線程我用lock鎖住資料庫了,但是由於獨立線程和線程池線程不在同一個方法中,所以訪問資料庫的時間不同,用lock只能對線程池線程有效 回答: 你這么講一定能保證兩個線程不會在一個時刻共同發起對資料庫的訪問么?除非你做了很多同步讓兩個線程都按照你設計的邏輯不發生訪問資料庫的沖突,否則你必須加鎖。看你的說明,你應該沒加同步,所以他會出現沖突,你不能缺鎖,他是共享資源的訪問了

Ⅲ 如何使用多線程同事訪問多個sqlite資料庫

SQLite作為一款小型的嵌入式資料庫,本身沒有提供復雜的鎖定機制,無法內部管理多路並發下的數據操作同步問題,更談不上優化,所以涉及到多路並發的情況,需要外部進行讀寫鎖控制,否則SQLite會返回SQLITE_BUSY錯誤,以駁回相關請求。
返回SQLITE_BUSY主要有以下幾種情況:
1。當有寫操作時,其他讀操作會被駁回
2。當有寫操作時,其他寫操作會被駁回
3。當開啟事務時,在提交事務之前,其他寫操作會被駁回
4。當開啟事務時,在提交事務之前,其他事務請求會被駁回
5。當有讀操作時,其他寫操作會被駁回
6。讀操作之間能夠並發執行
基於以上討論,可以看出這是一個典型的讀者寫者問題,讀操作要能夠共享,寫操作要互斥,讀寫之間也要互斥

可以設計如下的方案解決並發操作資料庫被鎖定的問題,同時保證讀操作能夠保持最大並發
1。採用互斥鎖控制資料庫寫操作
2。只有擁有互斥鎖的線程才能夠操作資料庫
3。寫操作必須獨立擁有互斥鎖
4。讀操作必須能夠共享互斥鎖,即在第一次讀取的時候獲取互斥鎖,最後一次讀取的時候釋放互斥鎖

Ⅳ VC多線程訪問資料庫的數據傳遞問題

說一些概念性的東西吧。
COM操作,它有一套自己關於跨線程和跨進程的模型,這是個復合模型,會衍生出大約7,8種組合。學習COM,這個是一定要吃透的。樓主閱讀一下關於CoInitializeEx函數的幫助文檔,能多多少少體會到一些。但如果沒學習過COM,光看MSDN的幫助文檔,如墜雲里霧里一般,很難理解的。因此,建議買本COM的書,稍微參閱一下,其次網上譬如CSDN中有很多熱心人寫的關於線程進程有關的COM模型,和使用規則,優缺點,可以拜讀一下!

在MFC中,可能不太會形成跨線程傳遞變數的危害性,這種觀念吧。所以,在MFC中,似乎我們能隨心所欲在線程之間傳遞變數,但其實是不對的,典型的就是主線程創建的窗口和控制項,最好不要在其它線程中直接操縱,而是通過線程間通信的方法,讓創建窗口和控制項的主線程來操縱窗口和控制項。

因此,變數是不能亂傳地,到了COM中,這個限制是非常明顯的,COM中有概念叫MARSHAL、PROXY、STUB,當然它主要是進程相關的概念,同樣說明了,非線程自己創建的東西,不是該線程使用就會有問題。

像VIEW這種界面的東西不要隨便亂傳給工作線程這種非界面線程。
我的建議是:
建工作線程,因為資料庫操作及從資料庫反饋到程序級的數據需要進行再加工,這些步驟都可能會非常耗時,耗時操作放在界面線程,會使界面線程無法處理WM_XXX的消息,造成界面假死。因此,像智能指針這種東西放到工作線程里進行獨立管理,工作線程通過智能指針向資料庫要數據,然後處理,存放數據結果到程序中約定的地方,如全局變數,虛擬內存等地方。數據處理完,通過自定義消息,向界面線程發送自定義消息,使界面線程能夠在自定義消息中,將保存的數據顯示到界面中,發送線程消息有個函數就是PostThreadMessage。
其他的細微細節也可以考慮,到底是創建自己的線程,還是使用線程池等。隨著經驗的豐富,會考慮很多問題的,關鍵是理論知識要學,實踐也不能沒有。

最後就是概念修正, _ConnectionPtr它是一個標準的C++類,C++類可以重載->操作符,這個被重載的指針操作符,使得通過該類實例化的變數在實際使用時,行為更像是一個指針,而不是個普通變數,這個被重載的指針操作符才是智能指針,而不是指_ConnectionPtr類是智能指針,頂多說它是個智能指針類,我也見過有翻譯成靈巧指針的,英文原版是SMART POINTER。

Ⅳ 如何用多線程讀取大文件並且做數據處理,100

先說幾個要點:

a、文件在操作系統級,有描述符標記,關聯到打開的文件表項,文件表項紀錄了一個很重要的信息,當前文件的指針;
b、cpu要乾的工作比讀文件快不,讀一次文件的速度要慢於cpu處理一次的速度,沒必要多多線程,多線程提升不了多少性能,還增加編程的難度,單線程處理即可。
c、待處理文件,必須知道一定的邊界值,如分頁邊界或單條紀錄邊界。
有了上面的前提,每個線程維護單獨的緩沖區,緩存區大小就是c點提到的邊界紀錄大小。線程啟動,把緩沖區讀滿,處理數據。此處有個要點,必須做文件鎖,把要讀的邊界鎖住。否則讀出來的數據會產生混亂。(如果強行打開多個不同的文件不劃算,內存佔用可能會過多)。產生混亂的原因簡單,讀文件實際上是進行系統調用,系統調用有自己的緩沖區,這緩沖區未必跟你設置的緩沖區一樣大。多次讀多次移動指針,不加文件鎖處理的數據必定會亂。
文件鎖兩種方式加鎖,對整個文件加鎖,對位元組區間加鎖。都不是什麼難事。
實現方式1:對整個文件加鎖,因為我們要保證的是讀到的數據別混亂。
實現方式2:如果內存足夠大,維護n個獨立的文件描述符,這些文件描述符必須有獨立的文件指針,操作系統上有對應實現。每個線程操作未讀紀錄,這么做還需要維護共享的已讀紀錄指針。防止重復處理。這么做處理完成如果需要按順序合並文件是難點。處理過的數據有新的紀錄邊界。要視實際情況而定能不能這么做。寫程序要優先保證的是正確性,之後才是提升效率。
我說的理論,依據是操作系統提供的api處理。別的語言要依賴操作系統運行。原理差不多,目標語言有沒有操作系統提供的api強悍。依據使用的目標語言而定。絕大多數能叫編程語言的語言都會提供操作系統api對應的方法。(腳本語言例外,如shell,perl,javascript,vbscript,就可能沒這么強的控制能力。),java,objective-c,swift,php,python一般是不會有問題的。

Ⅵ 項目中怎麼控制多線程高並發訪問

1、首先明確信號量Semaphore的用法,然後新建一個項目,new-->file-->class,隨意命名,此處命名為semaphoreDemo。