介绍

FlexyPool是一个开放源代码框架,可以监视数据源连接的使用情况。 由于我们以前缺乏对供应连接池的支持,因此该工具是不必要的。

FlexyPool最初是为独立环境设计的,并且DataSource代理配置是通过编程完成的。 使用Spring bean别名 ,我们甚至可以将已经配置的DataSource替换为FlexyPool Metrics感知的代理替代方案。

Java EE支持

最近,有人问我如何支持Java EE环境,本着真正的开源精神,我接受了挑战。 支持托管环境非常棘手,因为数据源已与应用程序逻辑完全分离,并且可以通过JNDI查找来使用。

一个缺点是我们不能使用自动池大小调整策略,因为大多数应用服务器返回自定义的DataSource实现(与其内部JTA事务管理器解决方案紧密集成),因此无法访问读/写连接池大小。

尽管DataSource可能无法调整,但我们至少可以监视连接使用情况,这也足以支持Java EE环境。

添加声明性配置

因为我们在托管环境中运行,所以我们无法再以编程方式配置DataSource,因此我们需要使用声明性配置支持。

默认情况下,FlexyPool在当前的类路径中查找flexy-pool.properties文件。 可以使用flexy.pool.properties.path系统属性来自定义位置,该属性可以是:

  • URL(例如文件:/ D:/wrk/vladmihalcea/flexy-pool/flexy-pool-core/target/test-classes/flexy-pool.properties
  • 文件系统路径(例如D:\ wrk \ vladmihalcea \ flexy-pool \ flexy-pool-core \ target \ test-classes \ flexy-pool.properties
  • 类路径嵌套路径(例如nested / fp.properties

该属性文件可能包含以下配置选项:

参数名称 描述
flexy.pool.data.source.unique.name 每个FlexyPool实例都需要一个唯一的名称,以便JMX域不会冲突
flexy.pool.data.source.jndi.name JNDI数据源位置
flexy.pool.data.source.jndi.lazy.lookup 是否延迟查找数据源(当实例化FlexyPoolDataSource时目标数据源不可用时很有用)
flexy.pool.data.source.class.name 可以使用此类名称在运行时实例化数据源
flexy.pool.data.source.property。* 如果在运行时实例化了DataSource,则每个flexy.pool.data.source.property。$ {java-bean-property}将设置新实例化的DataSource的java-bean-property(例如flexy.pool.data.source。 property.user = sa)
flexy.pool.adapter.factory 如果数据源支持动态调整大小,则指定PoolAdaptorFactory。 默认情况下,它使用不支持自动缩放的通用DataSourcePoolAdapter
flexy.pool.metrics.factory 指定用于创建指标的MetricsFactory
flexy.pool.metrics.reporter.log.millis 指定指标日志报告间隔
flexy.pool.metrics.reporter.jmx.enable 指定是否应启用JMX报告
flexy.pool.metrics.reporter.jmx.auto.start 指定是否应自动启动jmx服务(在Java EE环境中将其设置为true)
flexy.pool.strategies.factory.resolver 指定一个ConnectionAcquiringStrategyFactoryResolver类,该类用于获取ConnectionAcquiringStrategyFactory对象的列表。 仅当PoolAdaptor支持访问数据源池大小时,才应设置此值。

休眠连接提供者

大多数Java EE应用程序已经在使用JPA ,对于碰巧正在使用Hibernate的用户,我们可以使用hibernate.connection.provider_class配置属性来注入我们的代理数据源。

Hibernate提供了许多内置的扩展点,并且连接管理是完全可配置的。 通过提供一个自定义的ConnectionProvider,我们可以用FlexyPool代理替换原始的DataSource。

我们要做的就是将以下属性添加到我们的persistence.xml文件中:

<property name="hibernate.connection.provider_class"value="com.vladmihalcea.flexypool.adaptor.FlexyPoolHibernateConnectionProvider"/>

在后台,此提供程序将配置FlexyPoolDataSource并在需要新连接时使用它:

private FlexyPoolDataSource<DataSource> flexyPoolDataSource;@Override
public void configure(Map props) {super.configure(props);LOGGER.debug("Hibernate switched to using FlexyPoolDataSource");flexyPoolDataSource = new FlexyPoolDataSource<DataSource>(getDataSource());
}@Override
public Connection getConnection() throws SQLException {return flexyPoolDataSource.getConnection();
}

在运行时实例化实际的数据源

如果您不使用Hibernate,则需要在EntityManagerFactory完成引导之前准备好FlexyPoolDataSource:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="persistenceUnit" transaction-type="JTA"><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><jta-data-source>java:global/jdbc/flexypool</jta-data-source><properties><property name="hibernate.hbm2ddl.auto" value="update"/><property name="hibernate.show_sql" value="true"/><property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/><property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/></properties></persistence-unit>
</persistence>

在生产Java EE环境中,我们使用特定于应用程序服务器的DataSource配置,为简单起见,我将使用DataSourceDefinition批注配置FlexyPooldataSource:

@DataSourceDefinition(name = "java:global/jdbc/flexypool",className = "com.vladmihalcea.flexypool.FlexyPoolDataSource")
@Stateless
public class FlexyPoolDataSourceConfiguration {}

现在,我们需要将实际的DataSource属性传递给FlexyPool,这是通过flexy-pool.properties配置文件完成的:

flexy.pool.data.source.unique.name=unique-name
flexy.pool.data.source.class.name=org.hsqldb.jdbc.JDBCDataSource
flexy.pool.data.source.property.user=sa
flexy.pool.data.source.property.password=
flexy.pool.data.source.property.url=jdbc:hsqldb:mem:test
flexy.pool.metrics.reporter.jmx.auto.start=true

实际的数据源将在启动时由FlexyPoolDataSource创建。

从JNDI找到实际的数据源

如果实际的数据源已经由Application Server配置,我们可以指示FlexyPool从JNDI获取它。 假设我们具有以下DataSource配置:

@DataSourceDefinition(name = "java:global/jdbc/default",className = "org.hsqldb.jdbc.JDBCDataSource",url = "jdbc:hsqldb:mem:test",initialPoolSize = 3,maxPoolSize = 5
)
@Stateless
public class DefaultDataSourceConfiguration {}

要代理JNDI数据源,我们需要像这样配置FlexyPool:

flexy.pool.data.source.unique.name=unique-name
flexy.pool.data.source.jndi.name=java:global/jdbc/default
flexy.pool.metrics.reporter.jmx.auto.start=true

FlexyPoolDataSource与实际的DataSource一起定义:

@DataSourceDefinition(name = "java:global/jdbc/flexypool",className = "com.vladmihalcea.flexypool.FlexyPoolDataSource")
@Stateless
public class FlexyPoolDataSourceConfiguration {}

JPA必须获取FlexyPoolDataSource而不是实际的:

<jta-data-source>java:global/jdbc/flexypool</jta-data-source>

在TomEE中 ,因为未延迟实例化DataSourceDefinitions,所以在处理FlexyPoolDataSource定义时,实际的DataSource在JNDI注册表中可能不可用。

为此,我们需要指示FlexyPool依赖JNDI查找,直到实际请求了DataSource为止:

flexy.pool.data.source.jndi.lazy.lookup=true

结论

我上一次使用Java EE是在2008年,一个使用Java EE 1.4和EJB 2.1的项目。 在专门使用Spring 7年之后,我对Java EE的使用感到惊讶。 Arquillian绝对是我最喜欢的插件,因为集成测试在企业应用程序中至关重要。 CDI既简单又强大,我很高兴对依赖注入进行了标准化。

但是Java EE平台的最佳资产是社区本身。 Java EE具有非常强大的社区,愿意在需要时为您提供帮助。 我要感谢Steve Millidge(Payara和C2B2的创始人)为我提供了一些有关设计FlexyPool Java EE集成的重要技巧, Alex Soto , Antonio Goncalves , Markus Eisele以及我感兴趣的所有其他Java EE成员Twitter上的对话。

翻译自: https://www.javacodegeeks.com/2015/06/how-to-monitor-a-java-ee-datasource.html

如何监视Java EE数据源相关推荐

  1. 使用tinylog 1.1改进您在Java EE应用程序中的登录

    tinylog是Java的轻量级日志记录框架. 与Apache Log4j和Logback相反,tinylog由仅80KB的单个JAR文件组成,没有任何依赖性,并且具有静态logger类. 这意味着您 ...

  2. angular java_带有Angular JS的Java EE 7 –第1部分

    angular java 今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序. 在去那里之前,让我告诉您一个简短的故事: 我必须承认,我从来都不是Java语 ...

  3. 带有Angular JS的Java EE 7 –第1部分

    今天的帖子将向您展示如何使用Java EE 7和Angular JS构建非常简单的应用程序. 在去那里之前,让我告诉您一个简短的故事: 我不得不承认,我从来都不是Java语言的忠实拥护者,但是我仍然记 ...

  4. java hotspot mix_影响Java EE性能的十大问题

    缺乏适当的数据库SQL调优和容量规划 大家可能会对这一个感到惊奇:数据库问题.大多数Java EE企业系统是依赖关系型数据库处理复杂的业务流程.一个基础扎实稳固的数据库环境可以确保IT环境有规模的增长 ...

  5. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  6. java ee 笔试题目,JSP经典笔试@题目(含答案)

    JSP经典笔试@题目(含答案) 更新时间:2017/2/5 19:25:00  浏览量:557  手机版 JSP综合测试笔试 1)在Java EE中,Servlet是在服务器端运行,以处理客户端请求而 ...

  7. jakarta_适用于Java EE / Jakarta EE开发人员的Micronaut

    jakarta 城镇中有一个名为Micronaut的新微服务框架. 在这篇文章中,我将从Java EE / Jakarta EE的角度讨论如何冒险使用Micronaut框架. 我是Java EE开发人 ...

  8. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发

    <基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...

  9. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网

    Java EE应用程序入门 时间:2011-07-06 netbeans.org 本文将详细介绍使用 EJB 3.0 技术开发企业应用程序的基础知识,而 EJB 3.0 是 Java EE 5 平台的 ...

最新文章

  1. 06章 映射一对多双向关联关系、以及cascade、inverse属性
  2. QT Creator 版本大全及下载地址
  3. 网络嗅探与欺骗(FTP部分)
  4. 新手入门Web前端要掌握的4项基础技能
  5. (17)Zynq FPGA 全局定时器介绍
  6. visual studio 代码分析利器 FxCop
  7. 百度图神经网络学习——day04:图神经网络算法(二)
  8. python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...
  9. VS2010中打开VS2013/VS2012项目
  10. Python教程(非常好的教程)
  11. php图片转化为base64,php获取图片转为base64
  12. 站内搜索(ELK)之数据目录
  13. 9.14-9.18随笔之二
  14. 运维自动化之5 - 基于LVS实现4层负载均衡应用
  15. 应用窗口置顶工具 DeskPins
  16. php empty是什么意思,php empty 和空字符串区别
  17. 利用 Python 读写文本内容
  18. 传统计算机硬盘和固态硬盘有哪些区别,工业级固态硬盘与传统硬盘有什么区别...
  19. 测试用例的设计方法_场景设计法
  20. ps去水印教程_PS去水印教程:运用色彩原理去除半透明水印

热门文章

  1. mvc.net分页查询案例——实体层(HouseModel.cs)
  2. hibernate在分层架构中修改数据(update)时遇到的问题!!
  3. 2017蓝桥杯省赛---java---C---9(青蛙跳杯子)
  4. 轩辕剑之天之痕1-5java_轩辕剑游戏 轩辕剑1到5全系列下载
  5. idea 2个配置 实时编译 autowire注解错
  6. 转:IDEA 创建类注释模板和方法注释模板
  7. 转: 虚拟IP(VIP)原理
  8. os引导程序boot从扇区拷贝os加载程序loader文件到内存(boot copy kernel to mem in the same method)
  9. 动手学习_动手选择值
  10. 微信小程序css 华文琥珀_琥珀项目:较小的,面向生产力的Java语言功能