C++ OTL 看不到外部数据库更改

Posted

技术标签:

【中文标题】C++ OTL 看不到外部数据库更改【英文标题】:C++ OTL doesn't see external database changes 【发布时间】:2015-11-30 17:28:44 【问题描述】:

我有一个使用 OTLv4 连接到数据库的 C++ 程序。一切正常。我既可以向数据库中插入数据,也可以从数据库中读取数据。

但是,如果我从另一个程序更改数据库中的数据,那么这不会反映在我的 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();

我错过了什么,我需要做一些配置吗?关闭某种缓存?也许我真的每次都需要登录和注销?

【问题讨论】:

OTL FAQ 有一个关于 Oracle otl_subscriber 是否收到有关数据库更改的通知的问题。您是否使用它来检测外部变化? 好主意,但这是一个 MySQL 数据库,我认为 Oracle 功能不适用。 【参考方案1】:

我发现了问题所在:

问。 OTL:当我在 MySQL 中向表中插入新行时,我无法选择它,这是怎么回事?

如果您在 otl_stream 中使用准备好的 SELECT 语句,并继续执行/重用该语句以获取新行,则您需要在每次提取序列耗尽后提交(调用 otl_connect::commit())。提交调用将使您的 MySQL 服务器知道您当前的只读事务已完成,并且服务器可以启动一个新事务,这将使新插入的行对您的 SELECT 语句可见。换句话说,您需要提交 SELECT 语句才能看到新行。

来自http://otl.sourceforge.net/otl3_faq.htm

所以问题是,每当我执行 SELECT 语句时,我都必须调用 otl_connect::commit();,否则 MySQL 将无法理解语句已完成。

【讨论】:

只是想让你知道,这个问题对我帮助很大:) thx

以上是关于C++ OTL 看不到外部数据库更改的主要内容,如果未能解决你的问题,请参考以下文章

使用 OTL 库从 c++ 程序将数据插入 mysql 表

OTL 库 - SQL Server - C++ - 性能

如何使用 OTL ODBC 驱动程序将 C++ 连接到 MySQL?

在 C++ 中带有子句和函数的 oracle 的 OTL 问题

OTL使用指南

OTL技术应用