46.16.4. optimistic locking
您可以在集群环境中开启 optimisticLocking 并使用此 JDBC 的聚合存储库,其中多个 Camel 应用程序共享了聚合存储库的同一数据库。如果存在 JDBC 驱动程序的竞争条件,则 JdbcAggregationRepository 可能会引发特定厂商的异常。要了解,从 JDBC 驱动程序导致异常的问题被视为一个 optimistick 锁定错误,我们需要一个映射程序来执行此操作。因此,有 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockimisticingExceptionMapper 允许您根据需要实施自定义逻辑。有一个默认的实现 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper,它的工作方式如下:
以下检查已完成:
-
如果导致异常异常是
SQLException,则检查 SQLState(如果以 23 开头)。 -
如果原因异常是
DataIntegrityViolationException - 如果原因的异常类名称的名称中包含 "ConstraintViolation"。
- 如果配置了任何类名称,则为 FQN 类名称的可选检查。
您还可以添加 FQN 类名称,如果有任何原因异常(或任何嵌套)与 FQN 类名称相同,则它会有一个 optimistick 锁定错误。
下面是一个例子,我们从 JDBC 供应商定义 2 个额外的 FQN 类名称。
<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="transactionManager" ref="transactionManager"/>
<property name="repositoryName" value="aggregation"/>
<property name="dataSource" ref="dataSource"/>
<property name="jdbcOptimisticLockingExceptionMapper" ref="myExceptionMapper"/>
</bean>
<!-- use the default mapper with extraFQN class names from our JDBC driver -->
<bean id="myExceptionMapper" class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
<property name="classNames">
<util:set>
<value>com.foo.sql.MyViolationExceptoion</value>
<value>com.foo.sql.MyOtherViolationExceptoion</value>
</util:set>
</property>
</bean>