У меня есть программа C ++, которая использует OTLv4 для подключения к базе данных. Все работает нормально. Я могу как вставить данные в базу данных, так и прочитать данные из базы данных.
Однако, если я изменяю данные в базе данных из другой программы, это не отражается в моей программе на C ++. Если я, например, удаляю запись с помощью MySQL, то программа на C ++ все равно увидит эту запись. Данные, которые я вижу, — это данные, которые появились при первом входе программы в базу данных.
Если я выйду из системы и войду в систему каждый раз, когда делаю запрос, я получу текущее значение, но это не кажется эффективным. Точно так же, если я выполню запрос из программы на C ++, который изменит базу данных, тогда программа начнет видеть текущие значения вплоть до этой точки.
Для меня это похоже на какое-то чрезмерно агрессивное кэширование, но я не знаю, как это работает в OTL, я не видел упоминаний о кэшах, кроме, возможно, пула потоков, о котором я ничего не знаю.
Я не делаю ничего особенного. OTL компилируется с этими параметрами:
#define OTL_ODBC // Compile OTL 4.0/ODBC
#define OTL_UNICODE // Compile OTL with Unicode
#define OTL_UNICODE_EXCEPTION_AND_RLOGON
#define OTL_UNICODE_STRING_TYPE std::wstring
// The following #define is required with MyODBC 3.51.11 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
Код выглядит примерно так:
otl_connect::otl_initialize(1); // Multithreading
otl_connect database;
database.rlogon(...);
// Make queries with otl_stream and direct_exec
otl_stream stream(50, "select * from ...", database);
database.direct_exec("insert ... into ...", otl_exception::disabled);
database.logoff();
Есть что-то, что я пропустил, какую-то конфигурацию мне нужно сделать? Выключить какой-то кеш? Может быть, мне действительно нужно каждый раз входить и выходить из системы?
Я узнал, что не так:
Q. OTL: Когда я вставляю новую строку в таблицу в MySQL, я не могу выбрать ее, что происходит?
Если вы используете подготовленный оператор SELECT в otl_stream и продолжаете выполнять / повторно использовать этот оператор для получения новых строк, вам необходимо выполнить коммит (вызов otl_connect :: commit ()) после того, как последовательность выборки исчерпывается каждый раз. Вызов commit сообщит вашему MySQL серверу, что ваша текущая транзакция только для чтения завершена, и сервер может начать новую транзакцию, которая сделает новые вставленные строки видимыми для вашего оператора SELECT. Другими словами, вам нужно зафиксировать ваши операторы SELECT, чтобы иметь возможность видеть новые строки.
От http://otl.sourceforge.net/otl3_faq.htm
Таким образом, проблема заключалась в том, что всякий раз, когда я делаю заявление SELECT, я должен позвонить otl_connect::commit();
или MySQL не поймет, что утверждение закончено.
Других решений пока нет …