Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪个数据源api同时支持连接池和XA事务?_Java_Spring_Jdbc_Mule_Mule Component - Fatal编程技术网

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

Java 哪个数据源api同时支持连接池和XA事务?,java,spring,jdbc,mule,mule-component,Java,Spring,Jdbc,Mule,Mule Component,在下面的Mule流程中,我必须为JDBC连接实现连接池和XA事务。哪个数据源API同时支持连接池和XA分布式事务,以及如何使用Springbeans实现它并将其配置为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/e

在下面的Mule流程中,我必须为JDBC连接实现连接池和XA事务。哪个数据源API同时支持连接池和XA分布式事务,以及如何使用Springbeans实现它并将其配置为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
不应提供连接池,它是连接池的数据源