2015-11-30 79 views
1

我有一個使用OTLv4連接到數據庫的C++程序。一切工作正常。我可以將數據插入數據庫並從數據庫中讀取數據。C++ OTL沒有看到外部數據庫更改

但是,如果我從另一個程序更改數據庫中的數據,那麼這不會反映在我的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(); 

有什麼我已經錯過了,一些配置我需要做什麼?關閉某種緩存?也許我確實需要每次登錄和註銷?

+0

OTL常見問題有一個關於Oracle otl_subscriber是否獲取有關數據庫更改通知的問題。你使用它來檢測外部變化? –

+0

好主意,但這是一個MySQL數據庫,我不認爲Oracle功能適用。 – DaedalusAlpha

回答

1

我發現了什麼是錯誤的:

Q. OTL:當我插入新行到MySQL中的表,我無法選擇它,這是怎麼回事?

如果您在otl_stream中使用準備好的SELECT語句,並且繼續執行/重複使用語句以獲取新行,則需要在每次獲取序列耗盡後提交(調用otl_connect :: commit()) 。提交調用會讓你的MySQL服務器知道你當前的只讀事務已經完成,並且服務器可以啓動一個新的事務,這將使新插入的行對你的SELECT語句可見。換句話說,你需要提交你的SELECT語句才能看到新的行。

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

所以問題是,每當我做一個SELECT語句我要叫otl_connect::commit();或MySQL不會明白的語句執行完畢。

+0

只是想讓你知道,這個問題幫了我很多:) thx –