首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个数据源api同时支持连接池和XA事务?

哪个数据源api同时支持连接池和XA事务?
EN

Stack Overflow用户
提问于 2015-12-11 22:45:20
回答 1查看 174关注 0票数 0

在下面的Mule流中,我必须为JDBC连接实现连接池和XA事务。哪个数据源API同时支持连接池和XA分布式事务?如何使用spring bean实现它并将其配置为jdbc组件?

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:core="http://www.mulesoft.org/schema/mule/core"
    xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting"
    xmlns:jbossts="http://www.mulesoft.org/schema/mule/jbossts" xmlns:vm="http://www.mulesoft.org/schema/mule/vm"
    xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking"
    xmlns:jdbc-ee="http://www.mulesoft.org/schema/mule/ee/jdbc" xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd
http://www.mulesoft.org/schema/mule/ee/jdbc http://www.mulesoft.org/schema/mule/ee/jdbc/current/mule-jdbc-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/jbossts http://www.mulesoft.org/schema/mule/jbossts/current/mule-jbossts.xsd
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">

    <!-- <jdbc-ee:mysql-data-source name="MySQL_REP_Data_Source" user="${rep.db.user}" 
        password="${rep.db.password}" url="${rep.db.url}" transactionIsolation="UNSPECIFIED" 
        doc:name="MySQL Data Source" /> -->

    <spring:beans>
        <spring:bean id="MySQL_Data_Source"
            class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
            name="Bean">
            <spring:property name="driverClass" value="com.mysql.jdbc.Driver" />
            <spring:property name="jdbcUrl" value="${rep.db.url}" />
            <spring:property name="user" value="${rep.db.user}" />
            <spring:property name="password" value="${rep.db.password}" />
            <spring:property name="maxIdleTime" value="180" />
            <spring:property name="minPoolSize" value="10" />
            <spring:property name="acquireIncrement" value="-1" />
            <spring:property name="maxPoolSize" value="100" />
        </spring:bean>
    </spring:beans>

    <spring:beans>
        <spring:bean id="MySQL_REP_Data_Source" name="MySQL_REP_Data_Source"
            class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
            <spring:property name="user" value="${rep.db.user}" />
            <spring:property name="password" value="${rep.db.password}" />
            <spring:property name="url" ref="${rep.db.url}" />
        </spring:bean>
    </spring:beans>

        <jbossts:transaction-manager doc:name="Transaction Manager">
        <property key="com.arjuna.ats.arjuna.coordinator.defaultTimeout"
            value="${trans.default.timeout}" /> <!-- timeout in seconds -->
        <property key="com.arjuna.ats.arjuna.coordinator.txReaperTimeout"
            value="${trans.reaper.timeout}" />  <!-- timeout in milliseconds -->
    </jbossts:transaction-manager>

    <jdbc-ee:connector name="Reporting_Database"
        dataSource-ref="MySQL_REP_Data_Source" validateConnections="true"
        queryTimeout="-1" pollingFrequency="0" doc:name="Database">
        <reconnect blocking="false" frequency="10000" count="3"></reconnect>
    </jdbc-ee:connector>
    <vm:connector name="VM_Connector" validateConnections="true"
        doc:name="VM_Connector" createMultipleTransactedReceivers="true"
        numberOfConcurrentTransactedReceivers="4">
    </vm:connector>

    <flow name="ApiKeyLoadImplFlow" doc:name="ApiKeyLoadImplFlow"
        initialState="started">

        <vm:inbound-endpoint exchange-pattern="request-response"
            doc:name="Impl_ApiKeyLoad_Req" path="ImplApiKeyLoadReq"
            connector-ref="VM_Connector" responseTimeout="${vm.response.timeout}">
            <xa-transaction action="BEGIN_OR_JOIN" />
        </vm:inbound-endpoint>
        <logger message="Start of Api Key Load Implementation" level="DEBUG"
            doc:name="ENTRY_LOG" />
        <set-variable variableName="FlowData" value="#[payload]"
            doc:name="FlowData" />
        <set-variable variableName="#['UserId']" value="#[payload.getUserID()]"
            doc:name="UserID" />

        <choice doc:name="Choice">
            <when expression="#[payload.getType().equalsIgnoreCase('incremental')]">
                <choice doc:name="Choice">
                    <when expression="#[flowData.getAction().equalsIgnoreCase('update')]">
                        <flow-ref name="CheckApiKeyExistFlow" doc:name="CheckApiKeyExistsFlow" />

                        <choice doc:name="Choice">
                            <when expression="#[payload.size() == '0']">
                                <set-payload doc:name="FlowData" value="#[variable:FlowData]" />
                                <flow-ref name="InsertApiKeyFlow" doc:name="InsertApiKeyFlow" />

                            </when>
                            <when expression="#[payload.size() != '0']">
                                <set-payload doc:name="FlowData" value="#[variable:FlowData]" />
                                <flow-ref name="UpdateApiKeyFlow" doc:name="UpdateApiKeyFlow" />

                            </when>
                            <otherwise>
                                <set-payload value="#['Internal Server Error']"
                                    doc:name="Internal_Server_Error" />
                                <logger message="Status for UserId #[flowVars.UserId] : #[payload]"
                                    level="WARN" doc:name="Internal_Server_Status" />
                            </otherwise>
                        </choice>
                    </when>
                    <when expression="#[flowData.getAction().equalsIgnoreCase('delete')]">
                        <flow-ref name="CheckApiKeyExistFlow" doc:name="CheckApiKeyExistsFlow" />


                        <choice doc:name="Choice">
                            <when expression="#[payload.size() == '0']">
                                <set-payload value="#['DataNotFound']" doc:name="Data_Not_Found" />
                                <logger message="Status for UserId #[flowVars.UserId] : #[payload]"
                                    level="WARN" doc:name="Data_Not_Found_Status" />
                            </when>
                            <when expression="#[payload.size() != '0']">
                                <set-payload doc:name="FlowData" value="#[variable:FlowData]" />
                                <flow-ref name="DeleteApiKeyFlow" doc:name="DeleteApiKeyFlow" />

                            </when>
                            <otherwise>
                                <set-payload value="#['Internal Server Error']"
                                    doc:name="Internal_Server_Error" />
                                <logger message="Status for UserId #[flowVars.UserId] : #[payload]"
                                    level="WARN" doc:name="Internal_Server_Status" />
                            </otherwise>
                        </choice>
                    </when>
                    <otherwise>
                        <set-payload value="#['InvalidAction']" doc:name="Invalid_Action" />
                        <logger message="Status for UserId #[flowVars.UserId] : #[payload]"
                            level="WARN" doc:name="Invalid_Action_Status" />
                    </otherwise>
                </choice>
            </when>
            <when expression="#[payload.getType().equalsIgnoreCase('full')]">
                <set-payload doc:name="FlowData" value="#[variable:FlowData]" />
                <flow-ref name="InsertApiKeyFlow" doc:name="InsertApiKeyFlow" />

            </when>
            <otherwise>
                <set-payload value="#['Internal Server Error']"
                    doc:name="Internal_Server_Error" />
                <logger message="Status for UserId #[flowVars.UserId] : #[payload]"
                    level="WARN" doc:name="Internal_Server_Status" />
            </otherwise>
        </choice>
        <logger message="End of Api Key Load Implementation" level="DEBUG"
            doc:name="EXIT_LOG" />


        <catch-exception-strategy doc:name="Catch Exception Strategy">
            <logger level="WARN" doc:name="Exception_Log"
                message="Exception in ApiKeyLoadImplFlow #[System.getProperty('line.separator')] Error Description = #[exception.getMessage()]" />

        </catch-exception-strategy>
    </flow>
    <sub-flow name="CheckApiKeyExistFlow" doc:name="CheckApiKeyExistFlow">

        <logger message="Start of Check Api Key Implementation" level="DEBUG"
            doc:name="START_LOG" />
        <jdbc-ee:outbound-endpoint exchange-pattern="request-response"
            queryKey="checkdata" queryTimeout="-1" connector-ref="Reporting_Database"
            doc:name="Check_Value_Exists">
            <xa-transaction action="JOIN_IF_POSSIBLE" />
            <jdbc-ee:query key="checkdata"
                value="${ftp.db.t_bmrs_api_keys.checkdata.query}" />

        </jdbc-ee:outbound-endpoint>

        <logger message="End of Check Api Key Exists Implementation"
            level="DEBUG" doc:name="EXIT_LOG" />

    </sub-flow>
</mule>
EN

回答 1

Stack Overflow用户

发布于 2015-12-12 18:01:49

您需要有一个实现连接池的javax.sql.XADataSource。为此,您通常需要一个特定于JDBC驱动程序的数据源,因为支持XA (分布式事务)需要与数据库系统如何实现两阶段提交密切协调。

请注意,与其名称相反,javax.sql.ConnectionPoolDataSource不应提供连接池,它是用于的数据源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34226128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档