Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate处理500万条记录的方法_Java_Spring_Hibernate - Fatal编程技术网

Java Spring Hibernate处理500万条记录的方法

Java Spring Hibernate处理500万条记录的方法,java,spring,hibernate,Java,Spring,Hibernate,我需要处理超过500万到600万个财务记录,其中每个记录都是一笔交易 这是一个Spring、Hibernate解决方案 我可以列出以下四个步骤来说明我的背景 读取表中的每条记录。示例(工资) 仅访问特定的两列(主键字段-ID),(薪水-使用RSA加密的值) 解密属于薪资id的薪资字段 使用新的安全密钥再次加密 解决方案需要作为后台进程(可能是spring线程池任务执行器)完成,系统必须24*7运行 每个记录都是一个事务,那么加载要处理的记录的最佳方式是什么? 如果可能,请给我提供一个示例链接 我

我需要处理超过500万到600万个财务记录,其中每个记录都是一笔交易

这是一个Spring、Hibernate解决方案

我可以列出以下四个步骤来说明我的背景

  • 读取表中的每条记录。示例(工资)

  • 仅访问特定的两列(主键字段-ID),(薪水-使用RSA加密的值)

  • 解密属于薪资id的薪资字段

  • 使用新的安全密钥再次加密

    解决方案需要作为后台进程(可能是spring线程池任务执行器)完成,系统必须24*7运行

    每个记录都是一个事务,那么加载要处理的记录的最佳方式是什么? 如果可能,请给我提供一个示例链接

    我认为最好的做法是加载10条记录,然后加载下10条。如何用spring、hibernate实现这样的解决方案


  • 对于这样的工作,我会忘记实体框架作为hibernate,而坚持使用数据库端。(如果您在交易过程中没有其他工作要做,例如邮件发送、审核等,而代码仅在服务器端可用)

    创建一个执行该作业的存储过程,并在已知的低负载时间内运行一次。在5到30分钟内完成


    或者,创建一个一次执行一行的存储过程,并在(数据库)作业中延迟运行它,这样性能就不会受到影响。

    我将使用Quartz进行计划作业,它很容易与spring集成,过去对我来说效果很好。访问我同意的数据库


    您可以使用Hibernate,但必须确保使用 无状态会话,或根据需要定期刷新会话 手册中有解释。我会简单地使用JDBC来实现这一点吉卜赛特


    我的做法是:

  • JPA和Hibernate来管理我的实体
  • 让Spring管理会话和事务
  • 弹簧数据(如果需要)(可选)
  • 创建一个服务来运行我的逻辑
  • SpringBatch——习惯的工作:步骤:自动将服务连接到读写器。如果需要,使用处理器运行额外的逻辑
  • 配置作业启动器
  • 计划要执行的启动器
  • 将其与Cron同步例如,您可以每小时或30分钟24/7运行一次任务
  • 您可以使用线程池任务执行器

  • 计划不同的场景和不同的作业,以便在作业失败时可以运行另一个逻辑

    是否必须使用Hibernate?您应该看看JOOQ。您可以使用Hibernate,但必须确保使用无状态会话,或者按照中的说明定期刷新会话。我只是简单地使用JDBC。如果只有这两列,并且在更新期间不允许锁定整个表,那么如何知道应该使用哪个密钥进行解密?如果我使用Spring batch,我可以在失败的情况下重新尝试particualr记录吗?可以,您可以将作业/步骤配置为单独处理每条记录,然后可以管理运行时异常等故障。这是并行线程处理如何避免两个线程不处理同一行的情况?使用ReadCommitted隔离的事务性,这将防止线程使用脏读。