2012-03-20 27 views
1

我有一個使用休眠的應用程序。其中一個模塊在批處理過程中調用本地SQL(StoredProc)。它所做的大概是每次寫入文件時都會更新數據庫中的一個字段。現在我不確定需要寫多少個文件,因爲它取決於每天的交易次數,因此可能爲零到一百萬。使用本機SQL進行休眠批處理

如果我在while循環中使用這段代碼片段會有什麼問題嗎?

@Transactional 
public void test() 
{ 
    //The for loop represents a list of records that needs to be processed. 
    for (int i = 0; i < 1000000; i++) 
    { 

    //Process the records and write the information into a file. 
    ... 

    //Update a field(s) in the database using a stored procedure based on the processed information. 
    updateField(String.valueOf(i)); 


    } 
} 

@Transactional(propagation=propagation.MANDATORY)  
public void updateField(String value) 
{ 

Session session = getSession(); 

SQLQuery sqlQuery = session.createSQLQuery("exec spUpdate :value"); 

sqlQuery.setParameter("value", value); 

sqlQuery.executeUpdate(); 

} 

我的數據源和事務管理器是否需要其他配置?

我需要設置hibernate.jdbc.batch_size和hibernate.cache.use_second_level_cache嗎?

我需要使用會話刷新併爲此清除嗎? hibernate教程中的示例使用POJO,而不是本機SQL,因此我不確定它是否也適用。

請注意應用程序的另一部分已經使用休眠,因此儘可能多地我想堅持使用休眠。

謝謝你的時間,我希望你的快速回復。如果代碼片段也可能真的對我有用。


應用工作流

1)數據庫查詢的交易信息。 (交易日期,賬戶類型,貨幣等。)

2)對於每個賬戶進程的交易信息。 (折扣,當前餘額等)

3)將交易信息和處理後的信息寫入文件。

4)更新基於過程信息

5)的數據庫字段返回到步驟2,而其仍是帳戶。 (假設沒有拋出異常)

+0

Bump !!任何人有任何其他想法? – 2012-03-23 10:12:37

+0

凹凸!任何人都可以回答關於批量大小,二級緩存,會話刷新/清除的問題! – 2012-03-27 07:24:32

回答

0

代碼片段將爲每次迭代打開和關閉會話,這絕對不是一個好習慣。

是否有可能您有一項工作可以檢查文件夾中添加了多少新文件?

應該每15/25分鐘運行一次作業,檢查在過去15/25分鐘內更改/添加了多少文件並批量更新數據庫。

類似這樣會降低打開/關閉會話連接的數量。它應該比這更快。

+0

嗨,感謝您的回覆。我更新了我的問題,以更好地展示我的應用程序。除了你的建議之外,我還需要做其他更改,比如配置到事務管理器,會話刷新/清除等等。再次感謝您的幫助 – 2012-03-21 00:18:03

+0

如果您在Spring JDBC中使用Hibernate,那麼spring支持聲明性事務MGMT。 你可以在哪裏定義, 1.事務管理器,你想用哪種方法進行事務。 2.'TransactionProxyFactoryBean',針對你的DAO類 所以,你實際上會使用'TransactionProxyFactoryBean'的bean而不是你自己的DAO。這將創建一個圍繞你的DAO的代理。希望這可以幫助。 – Parth 2012-03-21 06:08:49

+0

再次感謝您的回覆。對不起如果我對你的問題不清楚。其實我在問,如果我仍然需要添加額外的配置來休眠,如事務管理器像** hibernate.jdbc.batch_size **和禁用** hibernate.cache.use_second_level_cache **。更新時也需要使用清空和清除方法。就像這裏顯示的那樣[http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html],因爲本教程僅顯示pojos im不知道它是否適用於本地sql。謝謝你的時間... – 2012-03-21 09:52:10