線程和資料庫
『壹』 請教如何進行多線程連接資料庫並寫入數據
#include <QCoreApplication>
#include "thread.h"
#include <QVector>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVector<Thread*> vector;
Thread *thread;
//創建多個線程,並start
for(int i=0;i<10;i++){
thread=new Thread;
vector.append(thread);
thread->set(i);
thread->start();
}
//等待所有線程執行完,然後刪除線程
foreach(thread,vector){
thread->wait();
}
foreach(thread,vector){
delete thread;
}
return a.exec();
}
-------------------------------------------------------------------------------------------------
#include "thread.h"
Thread::Thread(QObject *parent) : QThread(parent)
{
}
void Thread::run()
{
begin();
}
//為每個線程創建一個連接名
void Thread::set(int a)
{
connectionName=QString::number(a);
}
void Thread::connectionDatabase(QString dbName)
{
QsqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL",connectionName);
db.setHostName("localhost");
db.setDatabaseName(dbName);
db.setUserName("root");
db.setPassword("");
if(!db.open())
qDebug()<<"db open fail";
}
void Thread::begin()
{
QString dbName="learnsql";
connectionDatabase(dbName);
QSqlDatabase db=QSqlDatabase::database(connectionName);
db.transaction(); //開啟事物
QSqlQuery query(db);
//向表student中插入10000條數據
for(int i=1;i<=10000;i++){
query.exec("insert into student values(1)");
}
db.commit(); //提交事物
}
『貳』 java線程類中,可以實現對資料庫的操作嗎
當然是可以的,在線程裡面會有很多程序,可以調用任何程序啊,這樣調用的程序都在一個線程里完成的。在這個過程中當然也可以調用database類來完成對資料庫的操作。
『叄』 關於如何實現線程安全的資料庫連接
當你的程序不管是不是多線程的
獲得到一個資料庫連接是 資料庫會把這個連接標記為繁忙 當其他程序訪問時它會返回另外空閑的連接
連接個數是有限的 如果一直不釋放連接 資料庫就會告訴你連接已經使用完了
這里和線程安全有何關系呢? 線程安全和資料庫操作沒有直接關系
『肆』 請教關於多線程與資料庫操作的問題
文檔上對多線程下資料庫應用的注意事項寫的很簡明,一個線程創建的 QSqlDatabase 對象和 查出來的 QSqlQuery 對象只能給本線程用(注意,是對象,不是資料庫連接本身,連接本身用名字可以多線程使用),其他情況是「不支持的」。在一個需要有幾個線程並發訪問不同資料庫的應用中,我首先試圖在各個線程的起始分別以不同的名稱調用 addDatabase / database 、open,但是程序偶然會崩潰,跟蹤後發現,雖然Qt 聲稱很多方法是「線程安全」的,但是幾個方法串起來,就出問題了。Qt 會動態的載入資料庫的plugin, 載入 plug in 的部分,涉及到對本地庫文件的管理,這一部分,出現了競爭。於是,很自然的想到在初始連接部分設置 Mutex 保護,從 addDatabase / database到 open 的部分,要保證其原子性,問題再也沒有出現。
『伍』 請教一個多線程同時查詢資料庫問題
多線程操作,請確保每個線程操作的SQL語句中的表是相對獨立的。 不然,你需要安排線程間的順序,也就是lock代碼段。 同一時間,兩個線程一起跑同一句SQL,而且還操作同一張表,那麼,肯定就會有問題了。
一般這種是因為超出資料庫最大鏈接上限。再建立鏈接,不管緩存多少,會自動隊列消息等待。Timeout時間內沒有鏈接取消無法獲得鏈接許可權。可以將自己的資料庫鏈接個數設置大一些。
『陸』 多線程訪問資料庫問題
這個要看情況。
不同的資料庫情況不一樣。
一般說來是可以每個線程使用一個連接的(有時候會出現很難查找的奇怪問題)
保險一點還是共用一個連接 互斥佔用。
『柒』 資料庫數據接收線程和什麼相關
mysql連接表
1。通過線程的互斥來同步操作資料庫
2。資料庫採用事務處理表中的數據
3。採用共享方式打開資料庫,不是以獨占方式打開資料庫
建立一個mysql連接表加上一個臨界區,表結點是這樣的(mysqlcon,bool),根據實際情況定大小。我用的是10個連接。
當要進行mysql操作時,就從表中取出一個閑置的mysql連接,並把bool量改為true,使用完後改成false,臨界區的做用是保障一個mysql連接一次只能被一個線程使用。
『捌』 多個線程訪問資料庫問題。
oracle資料庫中,每個客戶端進程(userprocess)都會有一個服務端進程(serverprocess)與之對應連接,稱為一個session 。
每個serverprocess都會有獨立的PGA,所有serverprocess共享SGA資源。
『玖』 如何在多線程操作資料庫
通常,最好避免鎖定 public 類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出於同樣的原因,鎖定公共數據類型(相比於對象)也可能導致問題。鎖定字元串尤其危險,因為字元串被公共語言運行庫 (CLR)「暫留」。這意味著整個程序中任何給定字元串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字元串上放置了鎖,就將鎖定應用程序中該字元串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。某些類提供專門用於鎖定的成員。例如,Array 類型提供 SyncRoot。許多集合類型也提供 SyncRoot。