【问题标题】:How to create transaction handling by only using servlets and jdbc?如何仅使用 servlet 和 jdbc 创建事务处理?
【发布时间】:2015-09-29 06:51:04
【问题描述】:

我曾试图自己终止它,但我不能。 我需要将对象保存在数据库的多个相关表中,并且必须在一个事务中。 我正在使用 Servlet、JSP、JDBC。 (已经有了dao层和service层) 我们知道,事务总是必须在服务层。

我在使用 Spring MVC 的时候,总是在服务中使用这个注解:

@Transactional

并且在我的 spring.xml 中有 TransactionManager 的选项 现在我需要对 servlet 做同样的事情。 谁能帮我举一些关于 servlet 事务的小例子,或者有人对此有什么建议?

【问题讨论】:

  • 我的建议是使用 Spring 托管服务来为您执行此操作,我认为您不太可能真正想要跨所有应用程序层的每个请求的单个事务。然后,您可以通过 WebApplicationContextUtils 从您的上下文中检索该 bean
  • 嗨 MahdeTo,我与数据库的大部分操作都是相互关联的,必须是事务... 关于 Spring 托管服务:在我当前的任务中,我需要自己进行事务处理(不使用弹簧或其他东西)......试图找到一些例子......但没有运气......
  • 您是因为性能原因而使用 Servlet 而不是 Spring 控制器,还是 Spring 根本不可用?
  • 嗨,Fritz Duchardt,这是我的任务。你是对的,Spring 根本不可用......我在控制器中使用 servlet。 dao 层上的 JDBC。根本没有春天。在我的情况下,这将非常简单这就是为什么我不能使用这个注释@Transactional,我必须自己做一些事务管理器。
  • 如果您想手动处理事务边界,可以使用 TransactionTemplate 或 JDBCTemplate?

标签: java spring jsp servlets


【解决方案1】:

您有不同的方式来管理 JDBC 级别的事务。

最简单的方法是过滤器:您在开始或请求处理时打开事务并在结束时提交(或回滚)它。在其他层尽可能少的侵入,但不能在服务层进行事务划分。

相反,您可以添加代码以在所有(相关)服务方法中显式创建和提交事务。您可以将真实代码放在通用方法中以限制代码重复,但您必须始终如一地修改您的所有服务层。

另一种方法是,因为您有一个现有的服务层,所以模仿 Spring 并在您的服务类周围使用代理。代理将打开创建事务,调用真实方法并提交事务。恕我直言,这仍然是一种具有少量代码重复的侵入性方法。

我的选择是将方法 1 用于非常简单的用例或原型设计,将方法 3 用于更严重的用例 - 但这只是我的意见。

【讨论】:

  • 非常感谢,是的,这正是我需要的。
【解决方案2】:

我认为首先你需要了解你想使用哪个规范,然后弄清楚如何进行集成。

Java 中有很多技术和技术可以访问数据库。

一般来说,如果你想在最低层(JDBC)访问数据库,你必须自己管理事务。

This link 很有用,因为它提供了很多示例。一般来说你有setAutoCommit(false)' and thenrollback/commitonConnection` jdbc接口。

如果你想使用 hibernate 之类的东西(注意,你仍然不需要 spring)——事务接口可以很方便。 这是Example

Spring 作为一个集成框架允许通过定义相关 bean 来使用事务管理,因此您可以自行选择应该使用哪种事务管理技术。

这是一个广泛的话题,您可能有兴趣阅读This 以了解更多管理事务的弹簧方式。

一般来说,JDBC是java中访问数据库的最低级别,所有其他API都建立在它之上。

希望对你有帮助

【讨论】:

  • 嗨,Mark Bramnik,关于 jdbc 事务,已经了解,感谢您的回答。但我不能使用弹簧。在我的任务中,我必须自己处理事务,只使用 servlet,所有处理事务的工作都必须在服务层中。
  • 当然,没关系,我只是想对 java 中的一些事务管理技术提供一个简短的“一般”概述。如果你不使用spring,必须自己处理事务,请使用JDBC方式:)
  • 谢谢马克,我会的:)
【解决方案3】:

在您的服务方法上,您应该自己处理事务,您会在下面找到一个示例:

        try {
            dbConnection = getDBConnection();

            dbConnection.setAutoCommit(false);

            // do your database work preparedStatement Insert, Update 


            //OR                
            // If you are doing your work on DAO you can pass connection to your DAO                
            //XDao  xDao  = new XDao(dbConnection);
            //YDao yDao = new YDao(dbConnection);

            //xDao.doWork();
            //yDao.doWork()  

            dbConnection.commit();

            System.out.println("Done!");

        } catch (SQLException e) {

            System.out.println(e.getMessage());
            dbConnection.rollback();

        } finally {

            //Close prepared statements


            //close connection
            if (dbConnection != null) {
                dbConnection.close();
            }

        }

对于高级模式和理解,我推荐这篇博文here

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 2015-08-28
    • 1970-01-01
    • 2021-08-02
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多