如何使用springs在tomcat连接池中实现XA连接支持?

     2023-03-27     99

关键词:

【中文标题】如何使用springs在tomcat连接池中实现XA连接支持?【英文标题】:How to implement XA connection support in tomcat connection pool using springs? 【发布时间】:2015-12-17 11:08:28 【问题描述】:

我必须在我的 mule 流中实现支持 XA 事务的 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">

    <spring:beans>
        <spring:bean id="MySQL_Pooled_Data_Source" class="org.apache.tomcat.jdbc.pool.XADataSource"
            name="Bean">
            <spring:property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <spring:property name="url"
                value="jdbc:mysql://10.213.32.13:3306/DB_NE60BMRS_REP" />
            <spring:property name="username" value="Tester249" />
            <spring:property name="password" value="Tester249" />
            <spring:property name="maxActive" value="100" />
            <spring:property name="minIdle" value="10" />
            <spring:property name="initialSize" value="5" />
        </spring:bean>
    </spring:beans>

    <jdbc-ee:connector name="Reporting_Database"
        dataSource-ref="MySQL_Pooled_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" />

            <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 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>
</mule>

但我面临以下例外情况。如何使用springs实现XAconnection对上述池化的支持?

ERROR 2015-12-17 15:51:37,626 [[apikey_load_phase3].Mule.02] org.mule.retry.notifiers.ConnectNotifier: Failed to connect/reconnect: EEJdbcConnector

  name=Reporting_Database
  lifecycle=initialise
  this=15db0f5
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=false
  connected=false
  supportedProtocols=[jdbc]
  serviceOverrides=<none>

 *Root Exception was: Connection from pool does not implement javax.sql.XAConnection(SQL Code: 0, SQL State: + null). Type: class java.sql.SQLException*

【问题讨论】:

我认为你需要 TomEE。我的理解是 XA 事务是跨数据库(或其他)的。因此,如果我有 Sybase 和 Oracle,并且我想在一个事务中对两者进行一些活动。我的理解也是,这是您在完整的 JEE 应用服务器上执行的操作,而不仅仅是容器。 【参考方案1】:

你需要更换:

com.mysql.jdbc.Driver

与:

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

【讨论】:

我已经实现如下替换 com.mysql.jdbc.Driver 与 com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 但我现在面临以下问题 异常堆栈为:1. 逻辑句柄不再有效(SQL 代码:0,SQL 状态:+ null) (java.sql.SQLException) com.mysql.jdbc.SQLError:927 (null) 2. 逻辑句柄不再有效(java.sql.SQLException) (org.mule.api.transaction.TransactionException) org.mule.transport.jdbc.xa.ConnectionWrapper:299 (mulesoft.org/docs/site/current3/apidocs/org/mule/api/…) 注意那里发生了什么。由于您使用的是 JDBC 驱动程序的企业版,因此​​请使用 MuleSoft 开票。

使用 r2d2 在 rust/diesel 应用程序中实现连接池

...正在尝试在rust/diesel/rocket应用程序中实现连接池。不知道如何保证establish_pooled_connection()方法的内容只被调用一次,从而准备连接池。这是我的代码。来 查看详情

如何在 Spring/Tomcat 中完全禁用 JDBC 连接池?

】如何在Spring/Tomcat中完全禁用JDBC连接池?【英文标题】:HowtocompletelydisableJDBCConnectionPoolinginSpring/Tomcat?【发布时间】:2015-11-1206:57:14【问题描述】:我正在使用SpringDataSourcebean来配置JDBC连接。让它返回一个裸露的、非池化/非托... 查看详情

spring配置连接池和dao使用jdbctemplate

...,配置连接池(1)把代码中的实现在配置文件中实现2dao使用jdbcTemplate(1)创建service和dao,配置了service和dao对象,在service注入dao对象 (2)创建jdbcTemplate对象,把jdbcTemplate对象注入到dao里面(3)在jdbTemplate对象里面注 查看详情

如何使用hibernate在spring boot中实现分页

】如何使用hibernate在springboot中实现分页【英文标题】:Howtoimplementpaginationinspringbootwithhibernate【发布时间】:2015-12-0217:41:44【问题描述】:我正在使用带有休眠功能的SpringBoot,并且我想在我的项目中使用分页。我在谷歌上搜索并... 查看详情

使用 Tomcat 进行连接池时出现 SQLNestedException

】使用Tomcat进行连接池时出现SQLNestedException【英文标题】:SQLNestedExceptionwhenconnectionpoolingusingTomcat【发布时间】:2015-12-1711:12:13【问题描述】:这是mysql的jdbcconnectionpooling的Resource配置。<ResourceabandonWhenPercentageFull="50"auth="Contain 查看详情

如何使用 Java Spring 在 MySql 中实现多租户 [关闭]

】如何使用JavaSpring在MySql中实现多租户[关闭]【英文标题】:HowcanIachievemultitenancyinMySqlbyusingJavaSpring[closed]【发布时间】:2018-02-2605:13:48【问题描述】:如何使用MySqlJavaSpring最佳实践实现多租户,并建议使用任何其他数据库代替MyS... 查看详情

如何在 Spring Boot 中实现 Camunda SendTask

】如何在SpringBoot中实现CamundaSendTask【英文标题】:HowtoimplementCamundaSendTaskinSpringBoot【发布时间】:2020-10-0914:06:21【问题描述】:我是Camunda的新手,正在使用以下任务:业务规则任务-->(网关)-->发送任务-->用户任务在使... 查看详情

如何使用 C# 在 access 数据库中实现“右外连接”查询?

】如何使用C#在access数据库中实现“右外连接”查询?【英文标题】:Howtoimplement"RightOuterJoin"queryinaccessdatabaseusingC#?【发布时间】:2012-07-2305:12:46【问题描述】:我想编写RightOuterJoin查询以从access数据库中检索数据。如何... 查看详情

如何在 Tomcat 7 中使用 MySql 连接池设置领域?

】如何在Tomcat7中使用MySql连接池设置领域?【英文标题】:HowdoIsetupaRealmwithaMySqlConnectionPoolinTomcat7?【发布时间】:2013-07-0521:41:22【问题描述】:我正在尝试使用Tomcat7中的MySql连接池来设置领域。我已阅读所有文档并阅读了人们遇... 查看详情

如何在基于 Keycloak/Spring 的应用程序中实现单点注销?

】如何在基于Keycloak/Spring的应用程序中实现单点注销?【英文标题】:HowtoachieveSingleSign-OutinKeycloak/Springbasedapplications?【发布时间】:2018-11-1601:51:48【问题描述】:我有2个Spring网络应用程序。我正在使用Keycloak来保护它们。在Keycl... 查看详情

为啥要用spring管理连接池,它有啥好处?

使用应用服务器的连接池,效率较高,而且不需要在代码中出现数据库信息。使用spring管理连接池的话,与服务器无关,便于移植。参考技术A数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有... 查看详情

如何在spring boot中实现jms队列

】如何在springboot中实现jms队列【英文标题】:Howtoimplementjmsqueueinspringboot【发布时间】:2017-04-1708:58:00【问题描述】:我已经使用初始化程序创建了一个SpringBoot项目,我正在尝试创建我的第一条消息,但我不知道从哪里开始。我... 查看详情

如何在 C# 中实现线程关联?

】如何在C#中实现线程关联?【英文标题】:HowdoIimplementthreadaffinityinC#?【发布时间】:2017-12-1422:09:33【问题描述】:我有一个需要线程关联的第三方API。我在我的服务应用程序中使用WCF来处理来自客户端的请求,然后将这些请求... 查看详情

如何在 Spring Boot 中实现基于角色权限的系统

】如何在SpringBoot中实现基于角色权限的系统【英文标题】:HowtoimplementRolePermissionbasedsysteminSpringBoot【发布时间】:2016-11-0919:14:30【问题描述】:我正在尝试使用springboot和springsecurity来实现基于角色权限的系统。为此,我以http://w... 查看详情

如何在 Spark 中实现“交叉连接”?

】如何在Spark中实现“交叉连接”?【英文标题】:Howtoimplement"CrossJoin"inSpark?【发布时间】:2014-09-1113:38:22【问题描述】:我们计划将ApachePig代码迁移到新的Spark平台。Pig具有“Bag/Tuple/Field”概念,其行为类似于关系数据... 查看详情

Tomcat 连接池问题 - 无法在关闭的连接上调用方法

...发布时间】:2021-02-2414:55:02【问题描述】:我的应用程序使用Spring2.5.x并部署在Tomcat服务器上。有时,当我的数据库连接空闲时,我会收到以下错误:[TeraJDBC14.00.00.13][错误1095][SQLSta 查看详情

您将如何在 Tomcat 5.5 中实现加盐密码

】您将如何在Tomcat5.5中实现加盐密码【英文标题】:HowwouldyouimplementsaltedpasswordsinTomcat5.5【发布时间】:2010-09-1708:04:48【问题描述】:我的Web应用程序依赖于容器管理的安全性,我想知道是否可以使用加盐密码。据我所知,只需... 查看详情

如何使用 spring-security-core-ldap 插件在 grails 中实现 LDAP 身份验证?

】如何使用spring-security-core-ldap插件在grails中实现LDAP身份验证?【英文标题】:HowtoimplementLDAPauthenticationingrailswithspring-security-core-ldapplugin?【发布时间】:2012-02-1909:44:11【问题描述】:我是grails的新手,正在尝试实现LDAP身份验证... 查看详情