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

时间:2014-03-04 18:49:14

标签: java spring

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

  1. 连接MySQL数据库
  2. 从POJOs中的MySQLTable1获取数据
  3. 在内存中操作(更新,删除)
  4. 插入Netezza数据库表
  5. 每小时为每个客户(A,B,C)完成上述4个过程。

    我使用spring JDBC模板来获取这样的数据:

    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这样的东西来解决这个问题?
    4. 感谢您的想法和反馈。

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

2 个答案:

答案 0 :(得分:1)

是否存在数据污染的风险?

这取决于您对数据的处理方式,但如果每个实例都是独立的,我不会看到如何导致数据污染,您只需要确保并发运行的每个实例都不能处理相同的数据(客户ID)。

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

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

我的应用程序是否真的需要使用像Spring Batch这样的东西来解决这个问题?

是否确实需要它,可能不是,但是Spring Batch是针对这类应用程序而制作的,因此它可以帮助您构建应用程序(Spring Batch提供了可重复使用的功能,这些功能对于处理大量记录至关重要,包括日志记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理)。一切都可以在没有框架的情况下完成,如果你有一个非常小的应用程序,使用它可能会有点过分。但最后,如果你需要这些功能,你可能会想要使用它......

答案 1 :(得分:1)

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

是否存在数据污染的风险?客户端A和B读取单独的数据,因此不会通过意外读取或写入相同的数据来相互干扰。如果创建了具有相同ID的两个客户端,则存在风险,但事实并非如此。

是否需要使用spring数据事务管理器实现数据库事务? 尽管程序化事务管理存在许多缺陷并且最好避免,但没有强制要求这样做。 Spring Batch将为您管理事务,以及其他方面,如分页。

我的应用程序是否真的需要使用Spring Batch来处理这个问题?没有强制要求这样做,虽然它会有很大帮助,特别是在分页方面。您将如何处理返回数千行的查询?没有框架,这需要手动处理。