先来看看jboss数据源的整体类图。
1.入口类LocalTxDataSource,负责对外参数设置和初始化框架
2.获取数据库连接的入口类WrapperDataSource,其实现了DataSource接口
3.ManagedConnectionFactory接口用来获取真实连接和创建WrapperDataSource
4.LocalManagedConnectionFactory负责从driver获取连接,driver层面的参数都在这里维护
5.JBossManagedConnectionPool维护着连接池必须的参数,管理着连接池的状态
6.ManagedConnectionPool提供了获取和归还连接的功能
接下来看一下jboss数据源的初始化过程,主要关注一个问题:数据源连接池如何从配置的参数启动?
入口代理类为LocalTxDataSource,一般使用方式如下
LocalTxDataSource localTxDataSource = new LocalTxDataSource(); localTxDataSource.setName(dataSourceDO.getDsName()); localTxDataSource.setBackgroundValidation(dataSourceDO.isBackgroundValidation()); localTxDataSource.setBackGroundValidationMinutes(dataSourceDO .getBackgroundValidationMinutes()); localTxDataSource.setBlockingTimeoutMillis(dataSourceDO.getBlockingTimeoutMillis()); localTxDataSource.setCheckValidConnectionSQL(dataSourceDO.getCheckValidConnectionSQL()); localTxDataSource.setConnectionProperties(dataSourceDO.getConnectionProperties()); localTxDataSource.setConnectionURL(dataSourceDO.getConnectionURL()); localTxDataSource.setDriverClass(dataSourceDO.getDriverClass()); localTxDataSource.setExceptionSorterClassName(dataSourceDO.getExceptionSorterClassName()); localTxDataSource.setIdleTimeoutMinutes(dataSourceDO.getIdleTimeoutMinutes()); localTxDataSource.setMaxSize(dataSourceDO.getMaxPoolSize()); localTxDataSource.setMinSize(dataSourceDO.getMinPoolSize()); localTxDataSource.setNewConnectionSQL(dataSourceDO.getNewConnectionSQL()); localTxDataSource.setNoTxSeparatePools(dataSourceDO.isNoTxSeparatePools()); localTxDataSource.setPassword(dataSourceDO.getPassWord()); localTxDataSource.setEncPassword(dataSourceDO.getEncPassword()); localTxDataSource.setPrefill(dataSourceDO.isPrefill()); localTxDataSource.setPreparedStatementCacheSize(dataSourceDO .getPreparedStatementCacheSize()); localTxDataSource.setQueryTimeout(dataSourceDO.getQueryTimeout()); localTxDataSource.setSharePreparedStatements(dataSourceDO.isSharePreparedStatements()); localTxDataSource.setTrackStatements(dataSourceDO.getTrackStatements()); localTxDataSource.setTransactionIsolation(dataSourceDO.getTransactionIsolation()); localTxDataSource.setTxQueryTimeout(dataSourceDO.isTxQueryTimeout()); localTxDataSource.setUseFastFail(dataSourceDO.isUseFastFail()); localTxDataSource.setUserName(dataSourceDO.getUserName()); localTxDataSource.setValidateOnMatch(dataSourceDO.isValidateOnMatch()); localTxDataSource.setValidConnectionCheckerClassName(dataSourceDO .getValidConnectionCheckerClassName()); localTxDataSource.setCriteria(dataSourceDO.getCriteria()); localTxDataSource.init(zdatasource);
初始化过程如下:
public void init(ZDataSource zdatasource) throws Exception { initPool(); initConnectionManager(); pool.start(); initDataSource(zdatasource); this.zdatasource = zdatasource; }
其最核心的start方法
public void start() throws Exception { pool.startService(); connectionManager.setPoolingStrategy(pool.getPoolingStrategy()); connectionManager.startService(); if (logger.isDebugEnabled()) { logger.debug("Connection pool " + name + " is started"); } }
启动pool,根据criteria配置生成不同的Pool类型,默认OnePool
public void startService() throws Exception { if ("ByContainerAndApplication".equals(criteria)) poolingStrategy = new PoolBySubjectAndCri(mcf, name, poolParams, noTxSeparatePools, log); else if ("ByContainer".equals(criteria)) poolingStrategy = new PoolBySubject(mcf, name, poolParams, noTxSeparatePools, log); else if ("ByApplication".equals(criteria)) poolingStrategy = new PoolByCri(mcf, name, poolParams, noTxSeparatePools, log); else // "ByNothing".equals(criteria) poolingStrategy = new OnePool(mcf, name, poolParams, noTxSeparatePools, log); }
启动ConnectionManager,顺便做下预热
public void startService() { poolingStrategy.setConnectionListenerFactory(this); if (poolingStrategy instanceof PreFillPoolSupport) { PreFillPoolSupport prefill = (PreFillPoolSupport) poolingStrategy; if (prefill.shouldPreFill()) { prefill.prefill(); } } }
最后初始化datasource
private void initDataSource(ZDataSource zdatasource) throws ResourceException { datasource = (DataSource) mcf.createConnectionFactory(new ConnectionManagerDelegate(), this.name, zdatasource); } public Object createConnectionFactory(ConnectionManager cm, String dataSourceName, ZDataSource zdatasource) throws ResourceException { return new WrapperDataSource(this, cm, dataSourceName, zdatasource); }
相关推荐
3. **数据源与连接池配置**:JBoss在启动时不自动初始化连接池和数据源,而是在首次尝试连接时根据配置文件进行初始化。配置文件通常位于`server\default\deploy`目录下,例如`oracle-ds.xml`。在该文件中,你需要...
4. **初始化数据源**:启动应用服务器时,会自动加载和初始化数据源。 5. **使用数据源**:在代码中通过`DataSource`接口获取连接,进行数据库操作。 理解并正确配置这些JAR文件对于构建高性能、高可用性的Java应用...
- 数据源和连接池设置:配置数据库连接,如JNDI绑定、最大连接数等。 - EJB容器准备:为EJB提供运行环境,注册ejb-jar.xml中的组件。 - 启动监听器:开启HTTP、HTTPS、JMS等网络端口监听。 - 部署应用:扫描`...
5. **编写自定义PlugIn类**:创建`MyDataSourePlugin.java`,在这个类中初始化并注入数据源: ```java public class MyDataSourePlugin extends DatasourcePlugIn { @Override public void init() throws ...
3. **服务初始化**:JBoss根据配置文件加载并初始化各种服务,如EJB容器、Web服务器( Undertow 或 Tomcat )、JMS消息队列、持久化服务(Hibernate)等。 4. **模块加载**:JBoss模块系统会加载应用所需的类库和...
- **子系统配置**:管理员需要掌握如何配置JBoss7的各个子系统,例如数据源的配置。 ### 结论 JBoss7.1.1配置指南及管理员手册是一份详尽的参考资料,面向希望深入配置和管理JBoss应用服务器的IT专业人员。通过这...
2. 数据源配置:在 `standalone.xml` 中配置数据库连接池,如MySQL、Oracle等。 3. 应用安全设置:配置应用的角色和认证方式,如JaAS、LDAP集成。 九、启动与停止JBoss - 启动:`$JBOSS_HOME/bin/standalone.sh` -...
通常,在Web应用程序中,数据源常常通过Java Naming and Directory Interface (JNDI)进行管理,这允许多个应用共享同一个数据源,例如在应用服务器如Tomcat、JBoss或WebLogic中。然而,有时我们可能希望在非Web环境...
其简易的安装流程,仅需解压并设置几个环境变量,便能快速部署,极大地简化了服务器的初始化过程,提高了开发效率。 **4. 动态部署与更新** JBoss支持“热部署”,即在运行时不中断服务的情况下,通过简单地复制...
这些元素定义了应用程序如何与数据库或其他外部资源进行交互,通常包括数据源、JMS 队列和主题等。配置包括了如 `res-ref-name`、`res-type`、`res-auth` 和 `res-sharing-scope` 等属性,用于定义资源引用的名称、...
在`bootstrap`子项目中,我们将看到如何使用XML配置文件初始化Microcontainer,并声明需要管理的bean及其依赖。例如,我们可能有一个`MyService`类,它依赖于`DataSource`。在-beans.xml文件中,我们可以定义这两个...
通常通过`Persistence.createEntityManagerFactory()`方法,结合`persistence.xml`配置文件来初始化。 3. **实体管理器(EntityManager)**: 它是与数据库交互的主要接口,负责CRUD操作。如`em.persist()`用于保存...
`data-sources`元素是`struts-config.xml`中的一个重要组成部分,主要用于定义Web应用程序将要使用的一个或多个数据源。数据源在Java中通常是指数据库连接池,它们能够高效地管理和重用数据库连接,从而提高应用程序...
- **初始化设置**:基本的安全配置步骤。 - **快速配置**:简化的安全设置流程。 - **详细配置**: - **管理接口**:定义访问管理控制台所需的凭证。 - **安全域**:细粒度的安全策略定义。 - **Outbound ...
- **启动过程**:描述了启动JBoss服务器时JMX是如何被初始化的。 - **JBoss MBean服务**:具体讨论了JBoss中使用的MBean服务,如SAR部署器MBean和服务生命周期接口。 通过上述内容的介绍,我们可以看出,《JBoss ...
此外,连接JBoss到Oracle数据库,包括配置数据源(JNDI名)和使用JDBC驱动,也是这一过程的重要环节。 在【安装_参考资料】文件中,可能包含有详细步骤、配置示例、错误排查指南和最佳实践等内容。用户可以从中获取...
2. **EJB生命周期**:EJB有创建、初始化、活跃、钝化和销毁等生命周期阶段,每个阶段都有相应的回调方法,开发者可以重写这些方法以实现特定功能。 3. **EJB容器管理**:JBoss作为EJB容器,负责EJB的实例化、事务...