如何监视Java EE数据源

介绍

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

磁盘空间管理工具FolderSizes

现在的硬盘已经到了用TB来计量的级别&#xff0c;但也会感觉在不知不觉间空间竟然不够用了&#xff01;到底什么东西占用了我们这么多的磁盘空间呢? 这个软件可以帮你快速进行分析。FolderSizes 企业版是一款优秀的磁盘管理工具&#xff0c;它可以有效地帮助我们快速的查看并统…

vscode修改python终端_panda3d是python的一个高级的3D 渲染和游戏开发框架

1 介绍1.1 开发维护者:迪士尼VR工作室和卡耐基梅隆娱乐技术中心。1.2 是一个3D游戏引擎和一个 3D 渲染和游戏开发库。1.3 可以在这个框架下使用 Python 和 C 。1.4 Panda3D 是开源软件&#xff0c; 它的许可证让它可以用于任何用途&#xff0c; 包括商业用途。1.5 是python的三…

HTMl和css项目总结,HTML+CSS项目开发总结

好几天没更新博客了&#xff0c;刚实战完一个HTMLCSS的简单项目。经过几天的摸索&#xff0c;发现收益良多。之前只是单纯得写demo&#xff0c;看知识点&#xff0c;没有亲自实战项目。但实战过后才会了解&#xff0c;如何才能更好地提升自己的技术。针对这次项目开发&#xff…

Apache Camel日志组件示例

Apache Camel日志组件示例 您要将消息记录到底层的记录机制&#xff0c;请使用骆驼的log:组件。 Camel使用sfl4j作为记录器API&#xff0c;然后允许您配置记录器实现。 在本文中&#xff0c;我们将使用Log4j作为实际的记录器机制。 让我们从示例开始。 依存关系 您需要添加&am…

HDU--4768

题目&#xff1a; Flyer 原题链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4768 分析&#xff1a;二分。只需要注意到最多只有一个为奇数&#xff0c;则可以首先求出学生获得的总的传单数&#xff0c;为奇数时&#xff0c;二分找到答案。 1 #include<cstdio&…

js return的值取不到_【JS基础】隐式转换(一)

开篇JS作为一门动态语言十分灵活&#xff0c;但是伴随而来的弱类型隐式转化的问题让我们十分头疼。隐式作为一个大课题&#xff0c;很难用一个很简短的篇幅把JS的隐式转换讲解的十分清楚。所以我选择用多次少量的策略进行梳理&#xff0c;争取让你每看完一篇都会有加深对于JS隐…

html5 loaded,How do you check if a HTML5 audio element is loaded?

问题I am wanting to know how to check if a HTML5 audio element is loaded.回答1:To find out when the audio is ready to start playing, add listeners for the oncanplay or oncanplaythrough events. To find out when the audio has loaded at all, listen to the onl…

Java的坏功能是什么

总览 当您第一次学习开发时&#xff0c;您会看到关于不同功能的过分笼统的陈述&#xff0c;对于设计&#xff0c;性能&#xff0c;清晰度&#xff0c;可维护性来说&#xff0c;都是不好的&#xff0c;感觉就像是黑客&#xff0c;或者他们只是不喜欢。 这可能会得到现实世界经验…

面试题(2)

逻辑推理 1、你让工人为你工作7天&#xff0c;给工人的回报是一根金条。金条平分成相连的7段 &#xff0c;你必须在每天结束时给他们一段金条&#xff0c;如果只许你两次把金条弄断&#xff0c;你如何给你 的工人付费&#xff1f;   2、请把一盒蛋糕切成8份&#xff0c;分给8…

语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...

数据表&#xff08;4张&#xff09;及数据情况&#xff1a;搭建数据表数据参考&#xff1a;空杯希望&#xff1a;转行数据分析师专栏&#xff08;SQL篇&#xff09;-01SQL入门​zhuanlan.zhihu.com一、表的加法1、先新建一个表course1&#xff08;和course表数据结构一致&#…

星海中学2021高考成绩查询,广东中考时间2021

忙碌了整整一个学期&#xff0c;同学们最关心的当然是什么时候能好好的回家调节一下学习的节奏&#xff0c;一起来看看广东各个大学的寒假放假时间吧&#xff01;下面是由出国留学网小编为大家整理的“2021广东各大学寒假放假时间”&#xff0c;仅供参考&#xff0c;欢迎大家阅…

JDK 8 SummaryStatistics类

JDK 8中引入的三个新类是java.util包的DoubleSummaryStatistics &#xff0c; IntSummaryStatistics和LongSummaryStatistics 。 这些类使计算元素总数&#xff0c;元素最小值&#xff0c;元素最大值&#xff0c;元素平均值以及双精度&#xff0c;整数或long的集合中的元素总和…

plsql 设置鼠标行执行_如何制作键盘鼠标产品质量合格证

鼠标前盘属于办公用品套装&#xff0c;一般会一起销售&#xff0c;但是也不排除分开销售&#xff0c;无论是哪种方式键盘鼠标在生产销售时都需要携带对应产品质量合格证&#xff0c;对产品进行简单的说明&#xff0c;更能保障消费者的权益。那么如何制作产品质量合格证呢&#…

第四章例4-2

/* 输入一批学生的成绩&#xff0c;以负数作为结束标志&#xff0c;计算平均成绩&#xff0c;并统计不及格人数 */ #include<stdio.h> int main(void) {int count,num;double grade,total;num0;total0;count0;printf("Enter grades:");scanf_s("%lf"…

Spring RESTful错误处理

这篇文章将说明在Spring中可以为RESTful Web服务实现异常处理的方式&#xff0c;这种方式使得异常处理的关注点与应用程序逻辑分离。 利用ControllerAdvice批注&#xff0c;我们能够为所有控制器创建一个全局帮助器类。 通过添加用ExceptionHandler和ResponseStatus注释的方法…

html.action 访问分部视图,MVC+EF 随笔小计——分部视图(Partial View)及Html.Partial和Html.Action差异...

Partial View指可以应用于View中以作为其中一部分的View的片段(类似于之前的user control), 可以像类一样&#xff0c;编写一次&#xff0c; 然后在其他View中被反复使用。一般放在"Views/Shared"文件夹中以共享。创建Partial View&#xff1a;一般直接右键"Vie…

svm核函数gamma参数_非线性SVM与核函数

前面几篇我们介绍的都是线性支持向量机&#xff0c;换句话说&#xff0c;我们总可以用一条线或一个超平面将数据进行分割。如下图所示&#xff1a;但在更多情况下&#xff0c;有些数据是无法进行线性分割的。比如下面的例子&#xff1a;也就是说&#xff0c;你永远无法用一条直…

a查询计算机主机路由表信息,计算机网络主机A向其他主机B进行通信的流程

当主机A要与主机B通信时&#xff0c;地址解析协议可以将主机B的IP地址如(192.168.1.2)解析成主机B的MAC地址&#xff0c;以下为工作流程&#xff1a;第1步&#xff1a;根据主机A上的路由表内容&#xff0c;IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地…

使用Java将数据流式传输到HPCC

高性能计算集群&#xff08;HPCC&#xff09;是类似于Hadoop的分布式处理框架&#xff0c;除了它运行以自己的称为企业控制语言&#xff08;ECL&#xff09;的特定领域语言&#xff08;DSL&#xff09;编写的程序外。 ECL很棒&#xff0c;但是偶尔您会想用其他语言来执行繁重的…

anychart说明文档

今天学习anychart&#xff0c;在慧都控件网上看有关文档&#xff0c;模仿试着做了个demo&#xff0c;发现慧都空间网的“Flash图表AnyChart应用教程六&#xff1a;创建圆形仪表”里的指针“<pointer type"bar" value"35" color"Gray" />”…