我将 Spring Batch 用于执行大量批处理操作的系统。
我正在将 SimpleJobRepository 与内存 DAO 一起使用。
我想知道是否有办法避免使用 JobRepository?类似于无资源事务管理器的东西?
我问的原因是系统应该在不重新启动的情况下持续运行,我对它会消耗的内存有些担心。
我知道我可以使用基于数据库的 JobRepositry,但坦率地说,我真的根本不需要。
如果没有办法这样做,如果有人可以向我保证内存消耗问题,我将不胜感激。
谢谢。
我将 Spring Batch 用于执行大量批处理操作的系统。
我正在将 SimpleJobRepository 与内存 DAO 一起使用。
我想知道是否有办法避免使用 JobRepository?类似于无资源事务管理器的东西?
我问的原因是系统应该在不重新启动的情况下持续运行,我对它会消耗的内存有些担心。
我知道我可以使用基于数据库的 JobRepositry,但坦率地说,我真的根本不需要。
如果没有办法这样做,如果有人可以向我保证内存消耗问题,我将不胜感激。
谢谢。
您必须使用作业存储库,因为它包含有关作业上下文的信息。您的案例的解决方案是 - 使用 scope="prototype" 创建您的作业存储库,这将为每个作业创建一个新的内存中 dao(映射实现),因此不会出现内存问题。就批处理作业而言,每次创建新实例的开销是没有意义的。
In-Memory 实现有一个主要缺点:您不能在批处理中使用多线程。
因此,您必须使用数据库存储库。我建议你使用 H2 SQL:它是一个非常轻量级的嵌入式数据库。我们将它用于我们的单元测试。
它与 Hibernate 配合得很好。
这种方法优于 Ben 的方法是您可以连接到内存数据库以检查作业状态(和启动日期等)。
我认为只要我的批处理代码是线程安全的,存储库是在内存中还是在数据库中都无关紧要。是的,如果您使用数据库,您可能会失去一些集群优势,但如果我的服务器上只运行一个批处理作业并且它使用多线程来完成它的工作,那应该没问题。