{Core Java with Spring}通过普通JDBC调用PL SQL存储过程-理想情况下谁应该做事务管理

{Core Java with Spring}通过普通JDBC调用PL SQL存储过程-理想情况下谁应该做事务管理,java,spring,stored-procedures,transactions,Java,Spring,Stored Procedures,Transactions,我的应用程序从Java/Spring调用Oracle存储过程。没有Hibernate、iBatis或Spring JDBC模板。 这个服务器端/中间层是“瘦”的,没有业务逻辑检查,没有验证;它只是起到数据传输的作用 用户界面和数据库之间的层。java代码在数据检索或数据持久化时调用存储过程。 存储过程是与各种表/表关系交互并聚合数据的大人物 问题-在这种情况下,理想的交易管理者是谁?从Java代码还是从存储过程? 通常,当中间层管理数据或执行业务逻辑,或执行验证时,我们会使用普通的JDBC/OR

我的应用程序从Java/Spring调用Oracle存储过程。没有Hibernate、iBatis或Spring JDBC模板。 这个服务器端/中间层是“瘦”的,没有业务逻辑检查,没有验证;它只是起到数据传输的作用 用户界面和数据库之间的层。java代码在数据检索或数据持久化时调用存储过程。 存储过程是与各种表/表关系交互并聚合数据的大人物

问题-在这种情况下,理想的交易管理者是谁?从Java代码还是从存储过程?

通常,当中间层管理数据或执行业务逻辑,或执行验证时,我们会使用普通的JDBC/ORM框架 与各种表交互,从而管理事务。 但在我的用例中,SP与表交互,决定数据是否正确检索或是否能够持久化, 为什么它要依靠中间层来单独管理交易。它可以很好地知道是提交事务还是回滚事务

在数据检索时,总是编写一个充当聚合函数高级接口的SP不是更好吗, 或者在数据持久化的情况下使用汇总函数,最后执行事务提交或事务回滚

仅当中间层需要调用多个SP时,才需要处理事务管理 对于特定的操作。只要java代码只为特定操作[fetch/update/delete]调用单个存储过程, 在存储过程本身中管理事务提交和回滚不是很好吗

如果SP内部出现问题,它可以回滚事务并引发异常,然后 然后将该异常消息[或记录并传递自定义异常]传递到UI

相反的想法是让SP在遇到任何异常时引发异常,Java代码反过来捕获异常并执行事务回滚。 如果调用SP时没有异常,则让它执行事务提交。 但是在这里,SP已经知道事务是成功的还是失败的,那么为什么我们不能执行提交或回滚,然后是它自己,取而代之 以异常或无异常的形式传递该信息,并让java代码执行提交/回滚

更新:当事务为一个操作调用多个SP时,有一件事证明需要Java代码来管理事务是合理的。 但是,同样的结果也可以通过一个高级例程实现,该例程执行内部调用各个例程的逻辑,最后 做出提交/回滚的决定

请分享您对此的想法/建议/设计建议


PS:我没有在这里分享任何代码,但这是一个程序设计问题,谁应该管理事务?

这是一个哲学问题。 这里没有更好的了,这取决于你的喜好和你的专业领域

DBA会喜欢存储过程,java程序员不会

关于事务管理,我更喜欢采用统一的方法,而不是混合解决方案。 事务管理很复杂,如果您使用SP和数据库事务管理,我更愿意使用一种方法。如果您选择使用jdbc或ORM,请使用jdbc事务管理或spring抽象进行jdbc trx管理

SP方法有其优缺点:

Pro:

  • 您可以定制特定于数据库的查询,这样可能会获得更高的性能 演出
  • 较少的第三方依赖关系将导致 轻分布
  • 你是DBA
  • 缺点:

  • 你是依靠数据库的
  • JUnit需要与数据库交互
  • 你需要一个DBA
  • 无论如何,我会使用SpringJDBC模板,在我看来,它是一个很好的JDBC抽象,可以为您节省样板代码和bug

    如果您选择java事务管理,我将添加Spring平台TransactionManager

    添加SpringJDBC和SpringTX jar不会产生巨大的尺寸效应。
    这两个罐子大约是800k,我想还将添加一些额外的罐子。

    谢谢,但在开始之前,有一个澄清——您提到“您的方法有其优缺点”。事实上,我没有决定任何方法。到现在为止我还没有。你能澄清一下你认为我的方法是什么吗?这样我才能更好地理解你的帖子。我想你们认为我建议从存储过程中进行事务管理,具体的问题是关于事务管理,而不是关于存储过程与SpringJDBC/Hibernate的对比。只是想确定你是否理解正确