QMYSQLを使用してローカルデータベースに接続しています。アプリケーションは複数のスレッドで実行されます。各スレッドは、独立した接続を使用してデータベースに接続します。 Qtがデータベースに接続しようとすると、次のエラーが発生することがあります。どうしたの?Qt MySQLアダプタがランダムに接続を拒否する:MYSQLを割り当てることができません
QMYSQL: Unable to allocate a MYSQL object
更新
を接続するために使用されるコードを追加しました。このオブジェクトはスレッドに移動され、接続の名前が付けられます。 critical
は、重大なエラー(メッセージを表示)後にアプリケーションの実行を終了するためにメインウィンドウに送信される信号です。 log
は、データをログに記録してデータベースに出力する信号です。
void ClientWorker::connect() {
m_database = QSqlDatabase::addDatabase("QMYSQL","wsc");
m_database.setHostName(m_host);
m_database.setDatabaseName(m_databaseName);
m_database.setPort(m_port);
m_database.setUserName(m_db_username);
m_database.setPassword(m_db_password);
if(!m_database.open()) {
QString error = "Unable to connect to database. Reason:\n";
error+= m_database.lastError().text();
log("Unable to connect to database! ", error, "ERROR");
emit critical(tr("Database Error!"),error);
} else {
log("Connected to datbase successfully.", "", "NOTICE");
}
アップデート2
私は(主トレッドでないアクティブな接続で)接続はメインスレッドから作られるたびに、ドライバがロードに失敗することを実現します。私はちょうど(接続する前に)すぐに接続して切断するmain()
に小さなダミー接続コードを追加しました。そのコードを追加すると、すべて正常に動作します。スレッドがメインスレッドの接続の前に接続できない理由はわかりませんが、バグのように思えます。これが誰かを助けてくれることを願っています.3日間滞在しました:/
データベース接続の作成に使用しているコードを表示できますか? – eclarkso
@eclarkso私の質問が更新されました –
すべてのスレッドで同じ接続名( "wsc")を使用しているようですが、その場合は注意を喚起する警告メッセージが表示されますスレッド接続は同時にアクティブです)。それは問題ではないことを確認するためにスレッドIDや何かを接続名に追加する価値がありますか?それがないと仮定して、あなたはQt MySQLプラグインをコンパイルしましたか、またはそれはいくつかのサードパーティから来ましたか?どのバージョンのMySQL? – eclarkso