新聞中心
隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的應(yīng)用需要同時讀寫多個數(shù)據(jù)庫,并且需要保證數(shù)據(jù)的一致性和可靠性。而針對這種場景,Java的多線程技術(shù)可以很好地解決這個問題。本文將介紹如何利用Java多線程技術(shù),實現(xiàn)多條數(shù)據(jù)庫隨機(jī)讀寫。

創(chuàng)新互聯(lián)建站專注于德陽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供德陽營銷型網(wǎng)站建設(shè),德陽網(wǎng)站制作、德陽網(wǎng)頁設(shè)計、德陽網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造德陽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供德陽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
1. 數(shù)據(jù)庫隨機(jī)讀寫的概念
當(dāng)需要大量快速讀寫多條數(shù)據(jù)庫的時候,我們需要實現(xiàn)數(shù)據(jù)庫的隨機(jī)讀寫。隨機(jī)讀寫是指訪問數(shù)據(jù)庫中的數(shù)據(jù)時,不按照順序而是根據(jù)需要進(jìn)行訪問,這種訪問方式有助于提高數(shù)據(jù)庫的效率和性能。
2. 的步驟
(1)建立連接池
連接池是隨機(jī)讀寫數(shù)據(jù)的基礎(chǔ),我們需要在Java中建立與多條數(shù)據(jù)庫的連接池。這樣,可以在啟動時一次性建立連接,之后多線程可以共享使用。
(2)創(chuàng)建數(shù)據(jù)庫訪問對象
創(chuàng)建一個公用的數(shù)據(jù)庫訪問對象,所有的線程都可以共用這個對象,這能夠保證所有的線程都在同一個數(shù)據(jù)庫訪問中,防止出現(xiàn)數(shù)據(jù)競爭的情況,提高效率。
(3)實例化數(shù)據(jù)庫操作類
實例化數(shù)據(jù)庫操作類,該類包含所有操作數(shù)據(jù)庫的方法,包括查詢、插入、修改和刪除等操作。
(4)編寫多線程
編寫多個線程,并添加到線程池中,線程池負(fù)責(zé)管理線程的生命周期和資源,保證程序的穩(wěn)定和高效運行。每個線程都要不斷地從數(shù)據(jù)庫中讀取數(shù)據(jù),并且存儲到內(nèi)存中,而寫入數(shù)據(jù)則反之,從內(nèi)存中讀取數(shù)據(jù)并寫入到數(shù)據(jù)庫中。
(5)測試程序
測試程序,檢驗程序的效率和性能。通過不斷修改和優(yōu)化程序,達(dá)到更高效率的目的。
3. 實現(xiàn)效果
Java多線程技術(shù)實現(xiàn)多條數(shù)據(jù)庫的隨機(jī)讀寫,可以大大提高讀取數(shù)據(jù)的效率和性能。同時,通過編寫高效的代碼,可以大大降低 CPU 和內(nèi)存的使用率,節(jié)省系統(tǒng)資源。
實踐證明,采用Java多線程技術(shù)實現(xiàn)多條數(shù)據(jù)庫的隨機(jī)讀寫,可以大大縮短時間,一個簡單的例子,我們讀取同時讀取30個數(shù)據(jù)庫,每個數(shù)據(jù)庫有100萬條數(shù)據(jù),此時采用Java多線程技術(shù),可以在不到3秒鐘內(nèi)完成操作。
4.
本文介紹了的步驟,并且通過實例證明了這種方法的優(yōu)點。但是,在實際開發(fā)中,需要注意的是,Java多線程技術(shù)的使用需要非常小心,需要對線程進(jìn)行正確地管理和控制,以保證程序的穩(wěn)定和高效運行。
相關(guān)問題拓展閱讀:
- Java mysql數(shù)據(jù)庫多線程讀寫問題,謝謝!
- java 多線程 寫入數(shù)據(jù)庫 數(shù)據(jù)池
Java mysql數(shù)據(jù)庫多線程讀寫問題,謝謝!
設(shè)置conn.autocommit(false)
這樣就不會存在自動提交 也碰型就行吵手是說 你的操作還只是內(nèi)存操作 別人看檔嫌到的只能是沒有變化的表 直到你循環(huán)完畢用conn.commit()
設(shè)置的conn.autocommit(假)這將不存在自動提交意味著您的操作扮巧系統(tǒng)的內(nèi)存操作廳冊鍵,其他人可以看到?jīng)]有任何變化,直到你完姿巧成周期表中的conn.commit()
在MySQL 8.0 之前, 我們假設(shè)一下有一條爛SQL,
mysqlselect * from t1 order by rand() ;
以多個線程在跑,導(dǎo)致CPU被跑滿了,其他的請求只能被阻塞進(jìn)不來。那這種情況怎么辦?
大概有以下幾種解決辦法:
設(shè)置max_execution_time 來阻止太長的讀SQL。那可能存在的問題是會把所有長SQL都給KILL 掉。有些必須要執(zhí)行很長時間的也會被誤殺。
自己寫個腳本檢測這類語句,比如order by rand(), 超過一定時間用Kill query thread_id 給殺掉。
那能不能不要殺掉而讓他正常運行,但是又仿則碧不影響其他的請求呢?
那mysql 8.0 引入的資源組(resource group,后面簡寫微RG)可以基本盯敬上解決這類問題。
比如我可以用 RG 來在SQL層面給他限制在特定的一個CPU核上,這樣我就不管他,讓他備舉繼續(xù)運行,如果有新的此類語句,讓他排隊好了。
為什么說基本呢?目前只能綁定CPU資源,其他的暫時不行。
那我來演示下如何使用RG。
創(chuàng)建一個資源組user_ytt. 這里解釋下各個參數(shù)的含義,
type = user 表示這是一個用戶態(tài)線程,也就是前臺的請求線程。如果type=system,表示后臺線程,用來限制mysql自己的線程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的邏輯核數(shù),這里0-1代表前兩個核被綁定到這個RG。可以用lscpu,top等列出自己的CPU相關(guān)信息。
thread_priority 設(shè)置優(yōu)先級。user 級優(yōu)先級設(shè)置大于0。
mysqlmysql> create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)
RG相關(guān)信息可以從 information_schema.resource_groups 系統(tǒng)表里檢索。
mysqlmysql> select * from information_schema.resource_groups;+++++—+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+++++—+| USR_default| USER ||| 0 || SYS_default| SYSTEM||| 0 || user_ytt| USER |||19 |+++++—+3 rows in set (0.00 sec)
我們來給語句select guid from t1 group by left(guid,8) order by rand() 賦予RG user_ytt。
mysql> show processlist;+—–+—++——++++—+| Id | User| Host | db | Command | Time | State | Info|+—–+—++——++++—+| 4 | event_scheduler | localhost | NULL | Daemon || Waiting on empty queue | NULL|| 240 | root| localhost | ytt | Query || Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root| localhost | ytt | Query || starting | show processlist|+—–+—++——++++—+3 rows in set (0.00 sec)
找到連接240對應(yīng)的thread_id。
mysqlmysql> select thread_id from performance_schema.threads where processlist_id = 240;++| thread_id |++||++1 row in set (0.00 sec)
給這個線程278賦予RG user_ytt。沒報錯就算成功了。
mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)
當(dāng)然這個是在運維層面來做的,我們也可以在開發(fā)層面結(jié)合 MYSQL HINT 來單獨給這個語句賦予RG。比如:
mysqlmysql> select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()….rows in set (4 min 46.09 sec)
RG的限制:
Linux 平臺上需要開啟 CAPSYSNICE 特性。比如我機(jī)器上用systemd 給mysql 服務(wù)加上
systemctl edit mysql@80 AmbientCapabilities=CAP_SYS_NICE
mysql 線程池開啟后RG失效。
freebsd,solaris 平臺thread_priority 失效。
java 多線程 寫入數(shù)據(jù)庫 數(shù)據(jù)池
加線程鎖,這樣保證只有一個在運行.
多線程只是為了在運行這個的同時,還可以做別的.
并不是說,會同時進(jìn)行.
你這個首先得分開。
之一部分:你有很多線程在往數(shù)據(jù)池里面寫入數(shù)據(jù)。那么,你的線程只管寫數(shù)據(jù),不用理會其他的數(shù)據(jù)。
第二部分:你的另外的線程(這里可以用spring的job定時器啟動),這部分只管往數(shù)據(jù)庫寫入數(shù)據(jù),至于寫入的條件,你可以判斷數(shù)據(jù)池的數(shù)據(jù)是否達(dá)到寫入的標(biāo)準(zhǔn)。這里的線程可以配置為啟動一次就一直運行,或者是隔多少秒繼續(xù)運行。這樣可以提高效率。
第三部分:數(shù)據(jù)池,這里的數(shù)據(jù)池一定要之一部分和第二部分的線程都能夠訪問,并且是唯一的。你可以寫一個公用的類來進(jìn)行控制。
大致就是這樣的。
讓這個池子序列化。
你的池子和你同事的池子要排隊,排前面的先寫。
就如同你執(zhí)行兩個update語句,后面的一條不會在乎前面執(zhí)行的是什么內(nèi)容。
java中的隨機(jī)讀寫多條數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于java中的隨機(jī)讀寫多條數(shù)據(jù)庫,Java實現(xiàn)多條數(shù)據(jù)庫隨機(jī)讀寫,Java mysql數(shù)據(jù)庫多線程讀寫問題,謝謝!,java 多線程 寫入數(shù)據(jù)庫 數(shù)據(jù)池的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁題目:Java實現(xiàn)多條數(shù)據(jù)庫隨機(jī)讀寫(java中的隨機(jī)讀寫多條數(shù)據(jù)庫)
網(wǎng)頁路徑:http://fisionsoft.com.cn/article/cohidjo.html


咨詢
建站咨詢
