Używam QMYSQL do łączenia się z lokalną bazą danych. Aplikacja działa na kilku wątkach. Każdy wątek łączy się z bazą danych przy użyciu niezależnego połączenia. Czasami Qt zgłasza następujący błąd, gdy próbuję połączyć się z bazą danych. Jaki jest problem?Qt Adapter MySQL odmawia połączenia losowo: Nie można przydzielić MYSQL
QMYSQL: Unable to allocate a MYSQL object
Aktualizacja
Dodany kod używany do połączenia. Ten obiekt zostanie przeniesiony do wątku, nazwane zostanie połączenie. critical
to sygnał wysyłany do okna głównego w celu zakończenia wykonywania aplikacji po wystąpieniu błędu krytycznego (pokazującego komunikat). log
to sygnał, który jest emitowany do rejestrowania zdarzeń w bazie danych.
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");
}
Aktualizacja 2
Właśnie uświadomiłem sobie, że za każdym razem połączenie jest wykonane z głównym wątku, (bez aktywnych połączeń w głównej bieżnika) kierowca nie można załadować. Właśnie dodałem mały fałszywy kod połączenia w main()
, który łączy się i rozłącza natychmiast (zanim wątek się połączy). Dodając ten kod, wszystko działa dobrze. Nie jestem pewien, dlaczego wątki nie mogą się połączyć przed połączeniem w głównym wątku, ale myślę, że wygląda jak błąd. Mam nadzieję, że to pomaga komuś, Zajęło 3 dni mojego:/
Czy możesz wyświetlić kod, którego używasz do tworzenia połączeń z bazą danych? – eclarkso
@eclarkso Zaktualizowałem moje pytanie –
Wygląda na to, że używasz tej samej nazwy połączenia ("wsc") we wszystkich twoich wątkach - ale w takim przypadku oczekiwałbym zauważalnego ostrzeżenia, które zwróciłoby twoją uwagę (zakładając, że jest inny połączenia gwintowe są aktywne w tym samym czasie)? Może warto dołączyć identyfikator wątku lub coś do nazwy połączenia, aby upewnić się, że to nie problem? Zakładając, że tak nie jest, czy skompilowałeś wtyczkę Qt MySQL, czy też pochodzi ona od innej firmy? Jaką wersję MySQL? – eclarkso