51.16.4. 光驱锁定
您可以在集群环境中打开 optimisticLocking
并使用此 JDBC 的聚合存储库,其中多个 Camel 应用程序为聚合存储库共享同一数据库。如果出现 JDBC 驱动程序的竞争条件,则 JdbcAggregationRepository
可以响应特定的供应商异常。要了解 JDBC 驱动程序中的例外情况被视为 optimistick locking 错误,我们需要一个映射程序来执行此操作。因此,有 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper
允许您在需要时实施自定义逻辑。有默认的实现 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper
,其工作如下:
完成以下检查:
-
如果导致的例外是
SQLException
,则如果以 23 开始,则会检查 SQLState。 -
如果导致的例外是
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>