У мене є проект treeShop, який працює з базами даних електронних магазинів. У цьому проекті спочатку я вирішив використовувати постійне подлюченіе, і тільки потім, коли мені знадобилося зберігати інші дані я вирішив зробити модуль синхронізації. Як і багато web-майстрів, роботу програми я тестую на локальному веб сервері. Я прихильник Linux'а тому використовую збірку сервера XAMPP. Версія мого qt 5.2.1. Насправді версія не важлива, саме цю я взяв тому, що мені потрібен був webkit.
Підключення до бази просте:
QSqlDatabase db;
db = QSqlDatabase :: addDatabase ( "QMYSQL");
db.setHostName ( "hostName");
db.setDatabaseName ( "databaseName");
db.setPort (3306);
db.setUserName ( "userName");
db.setPassword ( "userPass");
db.open ();
За великим рахунком цього достатньо, і в тестах прога працює стабільно. Але ж я націлений на віддалене підключення. Крім власне самих налаштувань для з'єднання і користувача з відповідними правами, хостер повинен надавати послуги віддаленого підключення. Для її відкриття служба підтримки зазвичай просить ваш зовнішній ip, для внесення його до списку довірених.
Перші враження від роботи з віддаленою БД - ніякої різниці з локальною. Невеличкі гальма при додаванні записів, але це цілком очікувано. Однак при роботі з програмою, паузи неминучі (на введення даних, на аналіз виводу, на "відійти налити кави" і т.д.) і в цей момент відбувається розрив. Ви повертаєтеся до роботи, натискаєте оновити дані, а з'єднання немає (.
В налаштуваннях БД є параметри Timeout Setting.
На локальному все це діло було відключено, тому в тестах таких проблем не виникало (навіть коли я їх повключав, розриви виникали через раз). Як варіант вирішення проблеми - можна збільшити період, скажімо поставити не 10 сек, а 300 або більше. Я цей метод не прийняв зразу, так як націлений на роботу з "чужою" базою, настройки якої мені не доступні.
Я вирішив, що перемогти це потрібно засобами qt. Цікаво, якщо запитати у qt, чи є в момент розриву з'єднання:
qDebug () << db.isOpen ();
він бреше у відповість:
true
Перше рішення, було абсолютно тупе, але працювало. Фактично, я примусово робив reconnect при кожному зверненні до БД.
void myClass :: reconnect () { db.close (); db.open (); }
І цю функцію довелося натикати по всьому коду - тупе рішення.
"Не тупе" рішення прийшло після прочитання доків qt по драйверам для баз даних. Виявляється для різних баз є корисні опції. Мені допомогла MYSQL_OPT_RECONNECT.
Прописавши одного разу ось таке:
db.setConnectOptions ( "MYSQL_OPT_RECONNECT = TRUE;");
перед стрічкою
db.open ();
цілком достатньо, і не потрібна купа безглуздих функцій.
Коментарі
Дописати коментар