2012-03-20 29 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