какой API-интерфейс источника данных поддерживает как пул соединений, так и транзакции XA?

В приведенном ниже потоке Mule мне нужно реализовать как пул соединений, так и транзакцию XA для подключения JDBC. какой 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>

person Manjula Sajjanam    schedule 11.12.2015    source источник


Ответы (1)


Вам нужно иметь javax.sql.XADataSource, который реализует пул соединений. Обычно для этого вам потребуется источник данных, специфичный для драйвера JDBC, потому что поддержка XA (распределенных транзакций) требует тесной координации с тем, как система базы данных реализует двухфазную фиксацию.

Обратите внимание, что вопреки названию, javax.sql.ConnectionPoolDataSource не должен обеспечивать пул соединений, это источник данных для пула соединений.

person Mark Rotteveel    schedule 12.12.2015