【问题标题】:Make a J2EE application avoid updating the DB使 J2EE 应用程序避免更新数据库
【发布时间】:2016-02-22 21:31:32
【问题描述】:

我有一个同时运行 EJB 和 Spring 代码的 JBoss 6 应用程序(此决定涉及一些遗留问题)。它应该按需与 Oracle 和 PostgreSQL 数据库通信。 JPA 是完成数据库操作的方式,不涉及直接的 JDBC。

我想做以下事情:在不改变业务逻辑的情况下,能够从我的应用程序中“静默”数据库更新/删除,而不会中断任何异常流程。

我目前的想法是:

  • 从部署描述符中将 JDBC 驱动程序设置为只读 - 这仅适用于 PostgreSQL(Oracle 驱动程序不支持此)
  • 在 RDBMS 级别上创建一个只读用户 - 这可能会让我充满错误
  • 让所有事务回滚而不是提交 - 这可能吗?
  • 让实体管理器永远不会保留任何东西 - 将 FlushMode 设置为 MANUAL 并确保永远不会调用 flush() - 但 commit() 仍然会刷新所有内容。

还有其他简洁的方法吗?

【问题讨论】:

  • 我能想到的一种(相当复杂的)方法:使用instead of 触发器为每个表创建视图,该触发器会忽略所有更改。
  • 有什么目的呢?告诉用户他们在尚未持久化的情况下成功输入了一些数据似乎是一个问题,分配主键和其他任何需要数据库更新才能运行的东西也是如此。一种可能性是编写您自己的事务管理器,它可以检查您所处的模式并根据模式使用回滚覆盖提交。序列可以在操作事务之外使用,因此在需要时仍然可以使用。
  • a_horse_with_no_name 你的方法对我来说似乎是一个赢家。我创建了一个具有与原始用户表同名的视图的用户。现在我只需要在运行时动态更改数据源用户,这并非易事......仍在寻找解决方案。

标签: oracle postgresql jpa jdbc jta


【解决方案1】:

如果您想确保应用程序像在生产环境中一样工作,请在数据库的副本上工作。每天晚上使用一个调度程序来覆盖副本数据库。

【讨论】:

    【解决方案2】:

    我的请求还包括需要在运行时激活或停用此行为。

    我找到的解决方案(目前用于概念验证)是:

    • 创建一个新用户,授予他对默认架构表的权限;
    • 使用此用户为每个表创建具有相同名称(不带架构前缀)的视图;
    • 使用INSTEAD OF为每个在插入、更新或删除时不执行任何操作的视图创建一个触发器;
    • 为此用户创建数据源和持久性单元;
    • 在运行时注入两个实体管理器,使用需要的那个;

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2011-01-09
      • 1970-01-01
      • 2010-12-10
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2022-11-11
      相关资源
      最近更新 更多