繁体   English   中英

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

[英]which datasource api supports both connection pooling and XA transactions?

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

<?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>

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

需要注意的是相反的是顾名思义,一个javax.sql.ConnectionPoolDataSource不应该提供连接池,它一个连接池的数据源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM