jboss 数据源类图

[Jboss数据源一]初始化
内容提示:设置和初始化框架2.获取数据库连接的入口类WrapperDataSource,其实现了DataSource接口3.ManagedConnectionFactory接口用来获取真实连接和创建WrapperDataSource4.LocalManagedConnectionFactory负责从driver获取连接,driver层面的参数都在这里维护5.JBossManagedConnectionPool维护着连接池必须的...

先来看看jboss数据源的整体类图。

[img]http://dl2.iteye.com/upload/attachment/0099/2625/adc2b0c0-febb-32f9-bb53-edeab77ed5c8.jpg[/img]


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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值