2014-11-05 109 views
5

我正在使用spring启动并通过jpa使用tomcat连接池进行休眠。你能帮我理解春天在交易过程中如何使用数据库连接。例如,考虑以下情况:春季交易边界和数据库连接控股

  1. 我们有2个连接的DB连接池。
  2. Spring启动一个事务,即使用@Transactional注解修饰的调用方法。
  3. 这种方法做一个DB更新
  4. 的调用外部服务
  5. 作为响应从外部服务接收,它更新数据库和回报。
  6. 春季提交事务

假设外部服务(步骤4)需要1分钟才能完成,有多少DB连接将在数据库池?假设Spring在事务完成之前一直保持DB连接,那么在此期间接收到的任何请求将只有1个数据库连接可用,并且如果我们收到多个请求,它们将不得不等待数据库连接。

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

感谢

回答

5

首先您的理解是正确的。请参阅关于declarative transaction management的春季文档。

enter image description here

我想你做的事务中的外部服务调用,因为你想在例外的情况下,还原至数据库的变化。换句话说,您希望数据库更新反映外部服务调用的状态。

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

你应该考虑数据的一致性。数据库更新真的有必要与外部服务调用同步吗?外部服务呼叫是否可以移出交易边界?

2

您可以指定初始大小和连接池的最大尺寸按照您的要求(取决于您的应用程序的性能)。

例如,

<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> 

这将创建20个数据库连接INITIALSIZE是20,如果需要为maxActive上升到30数据库连接是30.您可以通过使用提供不同的属性自定义您的数据库连接池由Apache DBCP库提供。以上示例是使用Oracle 11g数据库创建连接池,我使用的是oracle.jdbc.driver.OracleDriver随附ojdbc6.jar或ojdbc6_g.jar