`
ynztpwl
  • 浏览: 59500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析Atomikos数据连接池源码,弄清testQuery

 
阅读更多

作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:Atomikos数据连接池

前言

Atomikos数据连接池,国内有一些应用,但testQuery这个属性,在网上均是简单配置,并没有做特殊说明。通过对Atomikos源码的分析,发现这里很有学问。

分析

我们使用的数据源是AtomikosDataSourceBean,在其doInit方法中,会调用AtomikosXAConnectionFactorycreatePooledConnection方法,该方法会返回一个AtomikosXAPooledConnection连接。

AtomikosXAPooledConnectionAbstractXPooledConnection的一个子类,AbstractXPooledConnection中,在调用createConnectionProxy时,会调用testUnderlyingConnection方法,用于进行测试。

在AtomikosDataSourceBeangetConnection时,调用connectionPool的borrowConnection方法从而调用AbstractXPooledConnection中的createConnectionProxy,从而调用testUnderlyingConnection方法。

可以看testUnderlyingConnection中的关键代码,一旦设置了testQuery,每次getConnection的时候,就会连接查询一次(通过jprofiler也可以检测出来):

如果失败,抛出CreateConnectionException异常。

注意ConnectionPoolborrowConnection方法,其中有一段:

可以看到,其做的事情,就是遍历连接池中的连接,一个一个的测试。注意ret = xpc.createConnectionProxy ( hmsg ),一旦该方法抛出CreateConnectionException,就执行it.remove();即将该连接从连接池中删除。

如果设置了testQuery属性,每次获取连接时testQuery,能够保证应用服务器启动之后,与数据库连接暂时中断之后,能够在下一次请求时,自动重新建立连接。

连接池是如何自动建立连接的呢?其实就是简单的把无效的连接一个一个删掉,直到全部删光了,池里面没有有效(poolAvailableSize==0,是根据连接的isTerminated状态来判断的,而不是是否被重置过)的连接了,这样根据连接池的机制,就会调用growPool方法去请求新的连接。

但是这样有性能消耗,而且还不小。对于网站展示部分,不需要实时去检测,可以考虑采用定时检测的方法:

n 首先,保证testQuery为空,不配置。

n 创建一个DbPoolMonitorService类,实现ApplicationContextAware接口,这样应用启动时,会自动注入ApplicationContext对象。这样,可以在service中,调用getBean方法,获取AtomikosDataSourceBean的实例,

AtomikosDataSourceBean ads = (AtomikosDataSourceBean)ctx.getBean(“jtaDataSource”);

然后,ads中能够获得minPoolSize/maxPoolSize/availablePoolSize/totalPoolSize等属性,可以做一个界面来监测数据连接池的使用和配置情况,甚至可以动态修改这些属性。

n 做一个定时器,调用一个DbPoolMonitorService定期去手工test。使用SELECT 1 语句即可。

n 注意:try 部分ads.setTestQuery (“SELECT 1”);然后调用BaseDao的实例去执行一句话,依然可以使”SELECT 1” 。finally部分ads.setTestQuery(null),以保证不对其他部分造成后续影响。

n 可根据用户访问量,来决定定时周期,一般10分钟左右即可。这样,避免了每次获取连接去做一次检测操作,又能够将故障限制在一定时间范围内。是一个较好的折衷做法。

补充:我们再看ret = xpc.createConnectionProxy ( hmsg )这句话,如果这时候DB和WebAppServer的网络链路已经正常,DB正常运行,返回将不是空,会退出循环。这样,如果连接池中的连接是多个,则只会生成1个新的连接,如果要保证连接池机制的效果,需要在写监控程序的时候,去取得所有有效连接,循环test。

分享到:
评论

相关推荐

    atomikos数据源包

    在Spring配置中,你需要创建一个对应的bean来定义数据源,并设置相应的属性,如连接池大小、超时时间等。 4. **Spring的事务注解**:在Spring应用中,你可以使用`@Transactional`注解来标记需要事务管理的方法或类...

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...

    SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo

    通过分析和学习这些示例,可以快速上手Spring Boot与Atomikos的分布式事务处理和动态数据源切换。 总的来说,Spring Boot与Atomikos的结合提供了强大的分布式事务解决方案,而动态数据源切换则增强了系统的灵活性,...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    Druid是一个优秀的数据库连接池组件,而AtomikosDataSource则是处理分布式事务的重要工具。下面我们将详细探讨如何利用Spring、Druid和AtomikosDataSource来实现这些功能。 1. **Spring框架与数据源** Spring提供...

    springboot + mybatis + atomikos 多数据源分布式事物管理

    这通常包括指定数据源类型、连接池大小、事务超时时间等。同时,还需要在 Spring Boot 的配置文件(application.properties 或 YAML)中声明 Atomikos 的相关属性。 接下来,为了使 MyBatis 与 Atomikos 集成,我们...

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...

    springboot-atomikos 多数据源统一事物管理demo

    在Bean的配置中,指定数据源的JNDI名称以及连接池的相关配置。 6. **启用事务管理**:使用`@EnableTransactionManagement`注解开启Spring的事务管理,并使用`@Transactional`注解标记需要进行事务控制的方法。 7. ...

    使用springboot+jta+atomikos配置多数据源事务

    本教程将详细介绍如何使用Spring Boot结合JTA(Java Transaction API)和Atomikos来配置多数据源事务。 首先,我们需要理解JTA的含义。JTA是Java平台的标准,用于管理跨多个数据源的分布式事务。它允许应用程序在一...

    spring+jpa+atomikos多数据源

    "spring+jpa+atomikos多数据源"是一个重要的技术组合,用于构建能够同时连接并操作不同数据库的应用程序。下面将详细介绍这个主题涉及的知识点。 首先,Spring框架是Java开发中最广泛使用的轻量级框架,提供依赖...

    非Maven基于SSM+Atomikos的分布式事务处理案例源码

    7. 数据源配置:由于涉及到多数据源,你需要为每个数据源创建单独的Atomikos数据源,并在Spring中声明这些数据源。 8. 事务边界设定:在业务代码中,通过`@Transactional`注解标记方法,声明该方法需要在事务内执行...

    spring+hibernate+atomikos多数据源

    Spring、Hibernate和Atomikos的组合就是一种强大的解决方案,它们可以协同工作以支持多数据源的分布式事务处理。接下来,我们将深入探讨这些技术以及如何配置它们来实现多数据源。 1. **Spring**: Spring是一个...

    Spring3.0+Hibernate+Atomikos多数据源分布式事务管理

    每个DataSource代表一个不同的数据库连接池,而Atomikos作为全局事务协调者,可以管理这些独立数据源的事务状态。 实现步骤通常包括: 1. 配置多个DataSource,每个对应一个数据源。 2. 创建Atomikos事务管理器bean...

    spring、mybatis、atomikos实现多数据源事务demo

    在这些源码中,可以看到如何配置和使用Atomikos来管理多数据源,以及如何在Spring和MyBatis中定义和调用事务边界。 具体实现步骤可能包括以下部分: 1. 配置Atomikos:在Spring配置文件中引入Atomikos的相关依赖,...

    springboot+mybatis+druid+atomikos 多数据源,分布式事务,集成websocket,redis,swagger2

    3. **Druid**:Druid是一个高性能的数据库连接池,它提供了监控、扩展性、连接有效性检查等功能,是Spring Boot项目中常用的数据库连接池组件。在多数据源场景下,Druid可以帮助管理不同的数据库连接,确保高效稳定...

    多数据源事务之解决方案jta+atomikos

    "多数据源事务之解决方案jta+atomikos"这个主题正是针对这一挑战提出的。JTA(Java Transaction API)和Atomikos是两个关键的组件,它们一起为Java应用提供了强大的分布式事务管理能力。 首先,JTA是Java平台企业版...

    Spring4+Hibernate4+Atomikos3.3多数据源事务管理

    本主题将探讨“Spring4+Hibernate4+Atomikos3.3多数据源事务管理”的相关知识点,这是一种实现分布式事务处理的有效方案。 首先,Spring框架是Java企业级应用中的核心组件,它提供了一个统一的依赖注入容器,简化了...

    atomikos分布式事务提交框架

    在实际使用Atomikos时,开发者需要配置相关的事务管理器,设置资源管理器(如数据库连接池),并确保应用程序的事务边界正确。同时,需要注意在分布式环境中可能出现的死锁、活锁问题,以及如何处理长时间运行的事务...

    spring、mybatis、atomikos实现DB2、Mysql多数据源事务demo

    6. 源码分析:通过阅读源码,可以深入理解如何将Spring、MyBatis和Atomikos集成,以及如何处理多数据源事务。注意观察DataSource、SqlSessionFactory、TransactionManager的配置,以及@Transactional注解的使用。 ...

    Spring多数据源atomikos所有jar包

    每个DataSource bean可以有自己的配置,如数据库连接池、驱动类等。然后,我们可以通过TransactionManager来管理和控制这些数据源上的事务。 Atomikos提供了UserTransaction接口的实现,它是JTA的核心部分,用于...

Global site tag (gtag.js) - Google Analytics