【问题标题】:ActiveMQ: how to set DB lock transaction isolation type properly?ActiveMQ:如何正确设置数据库锁事务隔离类型?
【发布时间】:2013-10-01 17:05:05
【问题描述】:

在我的 ActiveMQ 配置中,我想将默认的数据库锁事务隔离级别更改为 TRANSACTION_REPEATABLE_READ

API documentation 写道:

public void setTransactionIsolation(int transactionIsolation)

将事务隔离级别设置为其他 TRANSACTION_READ_UNCOMMITTED 这个允许的脏隔离级别可能 在集群数据库环境中无法实现,因此限制性更强 可能需要昂贵的选项,例如TRANSACTION_REPEATABLE_READ 查看Connection中的隔离级别常量

在 XML 配置中,jdbcPersistenceAdaptertransactionIsolation 属性只接受整数类型的值,所以我不能直接使用Connection.TRANSACTION_REPEATABLE_READ 常量,而只能使用value (4)

<persistenceAdapter>
    <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" transactionIsolation="4" lockKeepAlivePeriod="5000">
        <locker>
            <lease-database-locker lockAcquireSleepInterval="10000"/>
        </locker>
    </jdbcPersistenceAdapter>
</persistenceAdapter>

有没有办法,我可以指定常量而不是硬编码数字“4”?

由于 ActiveMQ 是基于 Spring 的,我想我可以尝试通过使用 <util:constant> 以某种方式分配它,但找不到如何去做......

【问题讨论】:

    标签: java spring activemq


    【解决方案1】:

    试试这个方法:

    <util:constant id="transactionType" static-field="java.sql.Connection.TRANSACTION_REPEATABLE_READ" />
    

    编辑:

    问题不在spring,而是在activemq XML Schema:

    <xs:attribute name="transactionIsolation" type="xs:integer">
    

    所以它不会接受硬编码 int 以外的任何其他值 - 您可以尝试在此处放置属性占位符:

     transactionIsolation="#{myproperty}"
    

    但我不确定这是否可行。

    解决这个问题的方法是通过纯 spring bean (bean id=...) 以某种方式配置 activemq,而不使用专用的 amq 标签。 EDIT2:这里有带有纯弹簧标签的示例配置http://activemq.apache.org/jms-and-jdbc-operations-in-one-transaction.html

    【讨论】:

    • 是的,我能够读出常量值,但我无法将它传递给 &lt;jdbcPersistenceAdapter&gt;,因为 XML 验证因非整数值而失败...
    • @Laimoncijus 尝试从我的初始答案的 EDIT 部分解决方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多