内存处理导致数据污染的风险-JAVA



我正在开发基于spring框架的java应用程序。

  1. 连接到MySQL数据库
  2. 从POJO中的MySQLTable1获取数据
  3. 在内存中对其进行操作(更新、删除)
  4. 插入Netezza数据库表

每小时为每个客户端(A、B、C)执行上述4个过程。

我使用springJDBC模板来获得如下数据:

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='A' AND COL4='CONDITION'

并在将每条记录写入Netezza表之前将其读取到POJO中。

该应用程序的多个实例将通过调度程序每小时运行一次。因此客户端A和客户端B可以同时运行,但是SELECT将是唯一的,我指的是的数据

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='A' AND COL4='CONDITION'

将不同于

SELECT COL1,COL2,COL3 FROM MySQLTable1 WHERE CLIENTID='B' AND COL4='CONDITION'

但请记住,所有这些都作为POJO存储在内存中。

我的问题是:

  1. 是否存在数据污染的风险
  2. 是否需要使用spring数据事务管理器来实现数据库事务
  3. 我的应用程序真的需要使用类似Spring Batch的东西来处理这个问题吗

我感谢您的想法和反馈。

我知道这是使用ETL工具的完美场景,但这超出了范围。

是否存在数据污染的风险

这取决于你对数据的处理,但我不知道如果每个实例都是独立的,你怎么会有数据污染,你只需要确保同时运行的每个实例都不是在同一数据上工作(客户端ID)。

是否需要使用spring数据事务管理器来实现数据库事务

您可能需要一个事务来插入到Netezza表中。您当然希望您的数据在结果表中具有一致的状态。如果在进程中间发生错误,您可能希望回滚在失败之前插入的所有内容。关于事务管理器,您并不特别需要Spring事务管理器。但由于您使用的是Spring,因此它可能是一个不错的选择。

我的应用程序真的需要使用类似Spring Batch的东西来处理这个问题吗

它真的需要它吗?可能不需要,但Spring Batch是为这类应用程序而设计的,因此它可能会帮助您构建应用程序(Spring Batch提供了可重复使用的功能,这些功能在处理大量记录时至关重要,包括日志记录/跟踪、事务管理、作业处理统计、作业重新启动、跳过和资源管理)。任何东西都可以在没有框架的情况下制作,如果你有一个非常小的应用程序,那么使用它可能会有些过头。但最后,如果你需要这些功能,你可能会想使用它…

Spring BatchETL,因此使用它非常适合此用例,也是商业ETL工具的一个很好的替代品。

是否存在数据污染的风险客户端A和B读取不同的数据,因此它们永远不会因为意外读取或写入相同的数据而相互干扰。风险在于,如果创建了两个具有相同ID的客户端,但事实并非如此。

是否需要使用spring数据事务管理器来实现数据库事务尽管程序化事务管理有很多陷阱,最好避免,但没有强制的必要这样做。SpringBatch将为您管理事务,以及其他方面,如分页。

我的应用程序真的需要使用类似Spring Batch的东西来处理这个问题吗没有强制需要这样做,尽管这会有很大帮助,尤其是在分页方面。您将如何处理返回数千行的查询?如果没有框架,这需要手动处理。

最新更新