2017-01-16 37 views
1

我目前正在嘗試在我的C++應用程序中使用事務,但我遇到了ODBC自動提交模式的問題。C++ Poco ODBC事務 - 自動提交模式

我正在使用POCO庫在同一臺機器上創建到PostgreSQL數據庫的連接。目前,我可以將數據作爲單個語句發送到此數據庫,但我無法弄清楚如何使用Poco的事務庫來更快地發送此數據。

因爲我有幾千條記錄要插入,所以繼續使用單插入語句非常慢並且不切實際 - 所以我嘗試使用Poco的事務來加速這一點(一點點)。

我遇到的錯誤是一個理論上簡單的一個 - 波科拋出以下錯誤:

'Invalid access: Session is in auto commit mode.' 

我明白了,因爲這樣的結果,我應該以某種方式設置爲「自動提交」假 - 因爲它只允許我逐行將數據提交到數據庫,而不是作爲單個事務。

問題是我如何設置它。

目前,我有Session.h創建一個會話,看起來很多這樣的:

session = new Poco::Data::Session(
       "ODBC", 
       connection_data.str() 
      ); 

如果連接數據是一個簡單的字符串流與登錄信息,密碼,數據庫,服務器和「驅動程序= {PostgreSQL ANSI};「告訴ODBC使用PostgreSQL的驅動程序。

我試過只是通過會話的setFeature或setProperty設置設置屬性「autocommit」爲false,當然這是無濟於事。 (這一點更像是一次溝渠嘗試)。

session->setFeature("AUTOCOMMIT", false); 

環顧四周,我直接從ODBC /會話創建ODBC sessionImpl/SessionImpl.h,而不是用上面這個通用方法,然後從創建這個新的會話對象看到了一種可能的替代方法。

這樣做的好處是,ODBC的sessionImpl參考了自動提交模式在頭,這將表明這將是能夠處理這個問題:

void autoCommit(const std::string&, bool val); 
    /// Sets autocommit property for the session. 

然而,之前已經不習慣sessionImpl,我不能garuntee如果這能起作用,或者如果可以的話,可以使用有限的文檔。

我使用C++ 03(不11),與Visual Studio 2015年 波科1.7.5 提升(如果需要)

Would any one know the correct way of setting this feature (above) or a alternative method to achieving this?

回答

4

編輯:看POCO的來源,網址爲:

https://github.com/pocoproject/poco/blob/develop/Data/ODBC/src/SessionImpl.cpp#L153

屬性似乎被命名爲autoCommit,看着

https://github.com/pocoproject/poco/blob/develop/Data/include/Poco/Data/AbstractSessionImpl.h#L120

屬性名稱的情況似乎很重要。那麼,如果你使用session->setFeature("autoCommit", false);它有幫助嗎?


廣東話你只需要調用相應的Session對象session->begin();session->end();

session->canTransact()返回的是什麼?

根據文檔begin()將啓動一個新的事務,文檔沒有提及任何需要在之前或之後設置的屬性。

參見:https://pocoproject.org/docs/Poco.Data.Session.html

+0

是的,我可以叫會話級>()開始,但它也將引發「:會話處於自動提交模式下無效的訪問。」以及。 - canTransact()的結果是1,我試着用這個來防止session-> begin()。 – Chris

+0

對不起,沒有得到你的問題。我想你也已經嘗試過使用Poco Transaction類嗎? – erg

+0

你是對的,我也嘗試創建一個Poco事務類。我目前正在嘗試直接創建一個ODBC SessionImpl對象,並嘗試以這種方式繞過它。 – Chris