當前位置:首頁 » 操作系統 » 資料庫操作多線程

資料庫操作多線程

發布時間: 2022-09-25 09:02:38

sql資料庫可以多線程查詢嗎

多線程操作,請確保每個線程操作的SQL語句中的表是相對獨立的。 不然,你需要安排線程間的順序,也就是lock代碼段。 同一時間,兩個線程一起跑同一句SQL,而且還操作同一張表,那麼,肯定就會有問題了。
一般這種是因為超出資料庫最大鏈接上限。再建立鏈接,不管緩存多少,會自動隊列消息等待。Timeout時間內沒有鏈接取消無法獲得鏈接許可權。可以將自己的資料庫鏈接個數設置大一些。

⑵ 如何在多線程操作資料庫

通常,最好避免鎖定 public 類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出於同樣的原因,鎖定公共數據類型(相比於對象)也可能導致問題。鎖定字元串尤其危險,因為字元串被公共語言運行庫 (CLR)「暫留」。這意味著整個程序中任何給定字元串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字元串上放置了鎖,就將鎖定應用程序中該字元串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。某些類提供專門用於鎖定的成員。例如,Array 類型提供 SyncRoot。許多集合類型也提供 SyncRoot。

⑶ 多線程如何並發訪問SQLite資料庫

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

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

⑷ 資料庫操作:到底是單線程單連接入庫快還是多線程多

資料庫的快慢,如果你指的是響應速度的話,其快與慢的瓶頸不在線程多少,而在於磁碟IO操作。如果需要提高響應的速度,做好資料庫優化,合理運用緩沖池。

⑸ 多線程操作資料庫會出錯嗎

這個要看情況。不同的資料庫情況不一樣。一般說來是可以每個線程使用一個連接的(有時候會出現很難查找的奇怪問題)保險一點還是共用一個連接互斥佔用。

java 多線程操作資料庫

//將資料庫中的數據條數分段
publicvoiddivision(){
//獲取要導入的總的數據條數
Stringsql3="SELECTcount(*)FROM[CMD].[dbo].[my1]";
try{
pss=cons.prepareStatement(sql3);
rss=pss.executeQuery();

while(rss.next()){
System.out.println("總記錄條數:"+rss.getInt(1));
sum=rss.getInt(1);
}
//每30000條記錄作為一個分割點
if(sum>=30000){
n=sum/30000;
resie=sum%30000;
}else{
resie=sum;
}

System.out.println(n+""+resie);

}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

}
線程類
publicMyThread(intstart,intend){
this.end=end;
this.start=start;
System.out.println("處理掉余數");
try{

System.out.println("--------"+Thread.currentThread().getName()+"------------");
Class.forName(SQLSERVERDRIVER);
System.out.println("載入sqlserver驅動...");
cons=DriverManager.getConnection(CONTENTS,UNS,UPS);
stas=cons.createStatement();
System.out.println("連接SQLServer資料庫成功!!");

System.out.println("載入mysql驅動.....");
Class.forName(MYSQLDRIVER);
con=DriverManager.getConnection(CONTENT,UN,UP);
sta=con.createStatement();
//關閉事務自動提交
con.setAutoCommit(false);
System.out.println("連接mysql資料庫成功!!");

}catch(Exceptione){
e.printStackTrace();
}
//TODOAuto-generatedconstructorstub
}


publicArrayList<Member>getAll(){
Membermember;
Stringsql1="select*from(selectrow_number()over(orderbypmcode)asrowNum,*"+
"from[CMD].[dbo].[my1])astwhererowNumbetween"+start+"and"+end;
try{
System.out.println("正在獲取數據...");
allmembers=newArrayList();
rss=stas.executeQuery(sql1);
while(rss.next()){
member=newMember();
member.setAddress1(rss.getString("address1"));
member.setBnpoints(rss.getString("bnpoints"));
member.setDbno(rss.getString("dbno"));
member.setExpiry(rss.getString("expiry"));
member.setHispoints(rss.getString("hispoints"));
member.setKypoints(rss.getString("kypoints"));
member.setLevels(rss.getString("levels"));
member.setNames(rss.getString("names"));
member.setPmcode(rss.getString("pmcode"));
member.setRemark(rss.getString("remark"));
member.setSex(rss.getString("sex"));
member.setTelephone(rss.getString("telephone"));
member.setWxno(rss.getString("wxno"));
member.setPmdate(rss.getString("pmdate"));
allmembers.add(member);
//System.out.println(member.getNames());
}
System.out.println("成功獲取sqlserver資料庫數據!");
returnallmembers;

}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("獲取sqlserver資料庫數據發送異常!");
e.printStackTrace();
}
try{
rss.close();
stas.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}

publicvoidinputAll(ArrayList<Member>allmembers){
System.out.println("開始向mysql中寫入");
Stringsql2="insertintotest.my2values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try{
ps=con.prepareStatement(sql2);
System.out.println("-------------------------等待寫入數據條數:"+allmembers.size());
for(inti=0;i<allmembers.size();i++){
ps.setString(1,allmembers.get(i).getPmcode());
ps.setString(2,allmembers.get(i).getNames());
//System.out.println(allmembers.get(i).getNames());
ps.setString(3,allmembers.get(i).getSex());
ps.setString(4,allmembers.get(i).getTelephone());
ps.setString(5,allmembers.get(i).getAddress1());
ps.setString(6,allmembers.get(i).getPmdate());
ps.setString(7,allmembers.get(i).getExpiry());
ps.setString(8,allmembers.get(i).getLevels());
ps.setString(9,allmembers.get(i).getDbno());
ps.setString(10,allmembers.get(i).getHispoints());
ps.setString(11,allmembers.get(i).getBnpoints());
ps.setString(12,allmembers.get(i).getKypoints());
ps.setString(13,allmembers.get(i).getWxno());
ps.setString(14,allmembers.get(i).getRemark());
//插入命令列表
//ps.addBatch();
ps.executeUpdate();
}
//ps.executeBatch();
con.commit();

ps.close();
con.close();
this.flag=false;
System.out.println(Thread.currentThread().getName()+"--->OK");
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("向mysql中更新數據時發生異常!");
e.printStackTrace();
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true&&flag){
this.inputAll(getAll());
}
}

⑺ java怎麼多線程操作一個資料庫

//將資料庫中的數據條數分段
public void division(){
//獲取要導入的總的數據條數
String sql3="SELECT count(*) FROM [CMD].[dbo].[my1]";
try {
pss=cons.prepareStatement(sql3);
rss=pss.executeQuery();

while(rss.next()){
System.out.println("總記錄條數:"+rss.getInt(1));
sum=rss.getInt(1);
}
//每30000條記錄作為一個分割點
if(sum>=30000){
n=sum/30000;
resie=sum%30000;
}else{
resie=sum;
}

System.out.println(n+" "+resie);

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
線程類
public MyThread(int start,int end) {
this.end=end;
this.start=start;
System.out.println("處理掉余數");
try {

System.out.println("--------"+Thread.currentThread().getName()+"------------");
Class.forName(SQLSERVERDRIVER);
System.out.println("載入sqlserver驅動...");
cons = DriverManager.getConnection(CONTENTS,UNS,UPS);
stas = cons.createStatement();
System.out.println("連接SQLServer資料庫成功!!");

System.out.println("載入mysql驅動.....");
Class.forName(MYSQLDRIVER);
con = DriverManager.getConnection(CONTENT,UN,UP);
sta = con.createStatement();
// 關閉事務自動提交
con.setAutoCommit(false);
System.out.println("連接mysql資料庫成功!!");

} catch (Exception e) {
e.printStackTrace();
}
// TODO Auto-generated constructor stub
}

public ArrayList<Member> getAll(){
Member member;
String sql1="select * from (select row_number() over (order by pmcode) as rowNum,*" +
" from [CMD].[dbo].[my1]) as t where rowNum between "+start+" and "+end;
try {
System.out.println("正在獲取數據...");
allmembers=new ArrayList();
rss=stas.executeQuery(sql1);
while(rss.next()){
member=new Member();
member.setAddress1(rss.getString("address1"));
member.setBnpoints(rss.getString("bnpoints"));
member.setDbno(rss.getString("dbno"));
member.setExpiry(rss.getString("expiry"));
member.setHispoints(rss.getString("hispoints"));
member.setKypoints(rss.getString("kypoints"));
member.setLevels(rss.getString("levels"));
member.setNames(rss.getString("names"));
member.setPmcode(rss.getString("pmcode"));
member.setRemark(rss.getString("remark"));
member.setSex(rss.getString("sex"));
member.setTelephone(rss.getString("telephone"));
member.setWxno(rss.getString("wxno"));
member.setPmdate(rss.getString("pmdate"));
allmembers.add(member);
// System.out.println(member.getNames());
}
System.out.println("成功獲取sqlserver資料庫數據!");
return allmembers;

} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("獲取sqlserver資料庫數據發送異常!");
e.printStackTrace();
}
try {
rss.close();
stas.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

public void inputAll(ArrayList<Member> allmembers){
System.out.println("開始向mysql中寫入");
String sql2="insert into test.my2 values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try {
ps=con.prepareStatement(sql2);
System.out.println("-------------------------等待寫入數據條數: "+allmembers.size());
for(int i=0;i<allmembers.size();i++){
ps.setString(1, allmembers.get(i).getPmcode());
ps.setString(2, allmembers.get(i).getNames());
//System.out.println(allmembers.get(i).getNames());
ps.setString(3, allmembers.get(i).getSex());
ps.setString(4, allmembers.get(i).getTelephone());
ps.setString(5, allmembers.get(i).getAddress1());
ps.setString(6, allmembers.get(i).getPmdate());
ps.setString(7, allmembers.get(i).getExpiry());
ps.setString(8, allmembers.get(i).getLevels());
ps.setString(9, allmembers.get(i).getDbno());
ps.setString(10, allmembers.get(i).getHispoints());
ps.setString(11, allmembers.get(i).getBnpoints());
ps.setString(12, allmembers.get(i).getKypoints());
ps.setString(13, allmembers.get(i).getWxno());
ps.setString(14, allmembers.get(i).getRemark());
//插入命令列表
//ps.addBatch();
ps.executeUpdate();
}
//ps.executeBatch();
con.commit();

ps.close();
con.close();
this.flag=false;
System.out.println(Thread.currentThread().getName()+"--->OK");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("向mysql中更新數據時發生異常!");
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true&&flag){
this.inputAll(getAll());
}
}

⑻ c# 多線程操作資料庫

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

⑼ Delphi中如何多線程操作資料庫中的數據表

1。通過線程的互斥來同步操作資料庫 2。資料庫採用事務處理表中的數據 3。採用共享方式打開資料庫,不是以獨占方式打開資料庫 建立一個mysql連接表加上一個臨界區,表結點是這樣的(mysqlcon,bool),根據實際情況定大校我用的是10個連接。

⑽ 請教關於多線程與資料庫操作的問題

文檔上對多線程下資料庫應用的注意事項寫的很簡明,一個線程創建的 QSqlDatabase 對象和 查出來的 QSqlQuery 對象只能給本線程用(注意,是對象,不是資料庫連接本身,連接本身用名字可以多線程使用),其他情況是「不支持的」。在一個需要有幾個線程並發訪問不同資料庫的應用中,我首先試圖在各個線程的起始分別以不同的名稱調用 addDatabase / database 、open,但是程序偶然會崩潰,跟蹤後發現,雖然Qt 聲稱很多方法是「線程安全」的,但是幾個方法串起來,就出問題了。Qt 會動態的載入資料庫的plugin, 載入 plug in 的部分,涉及到對本地庫文件的管理,這一部分,出現了競爭。於是,很自然的想到在初始連接部分設置 Mutex 保護,從 addDatabase / database到 open 的部分,要保證其原子性,問題再也沒有出現。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:333
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:374
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:610
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:106
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:940
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:737
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:801
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:507
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:370