简体   繁体   中英

which datasource api supports both connection pooling and XA transactions?

In the below Mule flow, i have to implement both connection pooling and XA transaction for JDBC connectivity. which datasource API supports both connection pooling and XA distributed transaction and how to implement it using spring beans and configure it to jdbc component?

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

You need to have a javax.sql.XADataSource that implements connection pooling. You will usually need a JDBC driver specific data source for this, because supporting XA (distributed transactions) requires close coordination with how the database system implements two-phase commit.

Note that contrary to what the name suggests, a javax.sql.ConnectionPoolDataSource should not provide connection pooling, it is a data source for a connection pool.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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