0

我們有一個使用Spring Integration和Spring Batch的Spring Boot應用程序。我們在輪詢器中放置一個文件並處理它。該過程將記錄插入到數據庫中,然後將它們讀出來進行一些處理並寫入文件。假設有10條記錄。我們第一次讀取10條記錄並寫入10條記錄。在不停止服務器的情況下,我們通過數據庫上的SQL客戶端刪除所有記錄,再次運行相同的文件,我們得到10條記錄,其中20條記錄被讀取。我相信有一些JPA或緩存與數據源進行。我們已經嘗試關閉JPA和緩存的幾個自動配置選項,但是我們沒有找到正確的配置選項來關閉緩存。如何在SpringBoot下關閉SpringBatch的JPA

給問題增加一點細節。

基本上我們有cron調度器有一個FileHandler。這個handleFile方法我們有以下幾點。

public File handleFile(File file) throws Throwable { 
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); 
    Job job = (Job) appContext.getBean("processInitialFileJob"); 
    JobExecution jb = jobLauncher.run(job, jobParametersBuilder.toJobParameters()); 
    .... 
} 

,我們可以做的代碼什麼上面,以確保它有一個新的JPA會話或者完全不使用JPA會議?這項工作需要每次從數據庫讀取,而不是數據庫的緩存表示。

回答

0

這最終不是Hibernate或JPA的問題,而是一個StringBuilder問題,它保留了以前運行的數據。我相信這需要設置爲@JobScope,以便在作業的不同執行過程中不會重複使用。

0

你在使用Hibernate嗎? Hibernate一級緩存可能會給你造成問題。 Hibernate管理會話本地的一級緩存。所以一旦你創建一個會話,並在該休眠中進行任何事務同步。但是當你在hibernate之外對錶進行任何修改時,休眠將不會同步,直到在會話上調用flush並關閉會話。

爲了確保不會發生這種情況,請在您的輪詢邏輯中嘗試創建新的Session(或JPA情況下的EntityManager),並關閉每個讀/寫/寫週期的會話。

也請確保此hibernate.current_session_context_class未設置爲線程。由於線程可以被輪詢器重用,因此可以再次注入相同的Hibernate會話。

+0

我有一個預感是問題。有沒有辦法把它完全關閉?所以基本上,如果我在表上進行讀取操作,我希望它實際讀取表格而不是表格的緩存表示。 –

相關問題