我有一个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中的表中插入一个新行时,我无法选择它,这是怎么回事?
如果您在otl_stream中使用准备好的SELECT语句,并继续执行/重用该语句以获取新行,则需要在每次提取序列用完后提交(调用otl_connect::commit())。commit调用将让MySQL Server知道您当前的只读事务已经完成,服务器可以启动一个新事务,这将使新插入的行对SELECT语句可见。换句话说,您需要提交SELECT语句才能看到新行。
发件人http://otl.sourceforge.net/otl3_faq.htm
所以问题是,每当我做出SELECT语句时,我都必须调用otl_connect::commit();
或MySQL,它们不会理解该语句已经完成。