当前位置: 首页 > 知识库问答 >
问题:

Spring事务边界和DB连接保持

司马宏邈
2023-03-14

我正在使用spring boot和hibernate over jpa以及tomcat连接池。您能帮助我理解spring在事务期间如何使用DB连接吗。例如,考虑以下场景:

  1. 我们有2个连接的DB连接池
  2. Spring启动一个事务,即用@Transactional注释修饰的调用方法
  3. 此方法执行数据库更新
  4. 呼叫外部服务
  5. 当从外部服务接收到响应时,它更新DB并返回
  6. Spring提交事务

假设外部服务(步骤4)需要1分钟才能完成,DB池中有多少DB连接可用?。假设Spring保持DB连接直到事务完成,在此期间收到的任何请求都只有1个DB连接可用,如果我们收到超过1个请求,他们将不得不等待DB连接。

请确认我的理解,如果正确,请建议我如何在高交易量系统中处理这种情况。

谢谢

共有2个答案

夹谷奇
2023-03-14

您可以根据需要指定连接池的初始大小和最大大小(取决于应用程序的性能)。

例如

<bean id="springDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
   <property name="url" value="jdbc:oracle:thin:@localhost:1521:SPRING_TEST" />
   <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
   <property name="username" value="root" />
   <property name="password" value="root" />
   <property name="removeAbandoned" value="true"/>
   <property name="initialSize" value="20" />
   <property name="maxActive" value="30" />
</bean>

当initialSize为20时,这将创建20个数据库连接,当maxActive为30时,如果需要,将最多创建30个数据库连接。您可以使用Apache DBCP库提供的不同属性自定义数据库连接池。上面的示例是使用Oracle 11g数据库创建连接池,我正在使用Oracle。jdbc。驾驶员OracleDriver与ojdbc6一起提供。jar或ojdbc6\u g.jar

燕和裕
2023-03-14

首先,你的理解是正确的。请参阅关于声明性事务管理的spring文档。

我猜您在事务中执行外部服务调用,因为您希望在发生异常时回滚数据库更改。或者换句话说,您希望数据库更新反映外部服务调用的状态。

如果是这样,则无法将其移出事务边界。在这种情况下,您应该增加连接池的大小,或者可以将长时间运行的事务委托给处理它们的专用服务器节点。这将使处理用户请求的“主”服务器节点远离长时间运行的事务。

并且你应该思考数据展示一致性,db更新是否真的有必要必须与外部服务调用同步,外部服务调用是否可以移出事务边界?

 类似资料:
  • 问题内容: 我正在尝试通过以下示例来消除我对Spring Transaction边界的怀疑。 我想将test2()方法与test1()隔离开,即每次调用test()时,test2()都不应读取test1()提交的数据。请建议是否可以使用传播或隔离属性来处理这种情况。 提前致谢。 问题答案: 事务属性应用于外部调用,而不是由bean方法(例如您的案例)进行的内部调用。如果要将事务边界应用于调用,则应

  • 我们正在将图形ql-spqr和图形ql-spqr-Spring启动器用于一个新项目(使用Spring数据JPA,Hibernate等)。 我们有这样一个突变: 这种突变工作正常: 我忽略了变量,因为它们不重要。如果我将其更改为: 我收到LazyInitalizationException,我知道原因: 家庭团队由一个ID引用,并由加载。返回的团队只是一个Hibernate代理。这对于保存新的匹配很

  • Serenity 使用简单的 ADO.NET 数据访问对象,像 SqlConnection、DbCommand 等。 它提供了一些基本的助手(helpers)来创建连接、添加参数、执行查询等。 SqlConnections 类 [命名空间: Serenity.Data, 程序集: Serenity.Data] 该类包含创建连接的静态函数,并在数据库中以不可见的方式控制它。 SqlConnectio

  • 我有一个关于ApacheCamel的问题。我无法找到多播是否被事务处理。如果它被事务处理,事务是如何实现的?事务边界是什么?

  • 管理交易 在 1.4 版更改: 对会话事务管理进行了修改,使其更清晰、更易于使用。特别是,它现在具有“autobegin”操作的特点,这意味着事务开始的点可以被控制,而不必使用传统的“autocommit”模式。 这个 Session 一次跟踪单个“虚拟”事务的状态,使用一个名为 SessionTransaction 。然后,该对象利用基础的 Engine 或引擎,而这些引擎 Session 对象

  • 我使用Spring boot作为rest后端系统和Spring数据,我有三个主要层(控制器、服务、dao)。 我用@Transactional注释了服务类,并且在它的一个方法中,我正在检索一些与其他实体具有@ManyTo很多关系的实体。 我只想得到主实体,我依赖于@ManyToMany的懒惰。 问题是在从服务返回到控制器之后,当我点击(多)端时,会发出一条sql语句并检索集合,就好像事务仍在运行一