如何监视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=trueFlexyPoolDataSource與實際的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数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Java EE,Docker和Maven
 - 下一篇: win10强制关机的方法(苹果手机强制关