2014-11-05 44 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