pool(五)——BasicDataSource
来源:互联网 发布:新浪nba科比数据 编辑:程序博客网 时间:2024/04/30 19:07
1.一次query流程
query真正执行的时候,才会去获取连接
{@link org.springframework.jdbc.core.JdbcTemplate#query}
{@link org.springframework.jdbc.core.JdbcTemplate#execute}
{@link org.springframework.jdbc.datasource.DataSourceUtils#getConnection}
{@link org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection}
{@link org.apache.commons.dbcp2.BasicDataSource#getConnection}
{@link org.apache.commons.dbcp2.BasicDataSource#createDataSource}
{@link org.apache.commons.dbcp2.PoolingDataSource#getConnection}
<p/>
{@link org.springframework.jdbc.core.StatementCallback#doInStatement}
{@link org.apache.commons.dbcp2.DelegatingStatement#executeQuery}
{@link org.springframework.jdbc.core.JdbcTemplate#query}
{@link org.springframework.jdbc.core.JdbcTemplate#execute}
{@link org.springframework.jdbc.datasource.DataSourceUtils#getConnection}
{@link org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection}
{@link org.apache.commons.dbcp2.BasicDataSource#getConnection}
{@link org.apache.commons.dbcp2.BasicDataSource#createDataSource}
{@link org.apache.commons.dbcp2.PoolingDataSource#getConnection}
<p/>
{@link org.springframework.jdbc.core.StatementCallback#doInStatement}
{@link org.apache.commons.dbcp2.DelegatingStatement#executeQuery}
2.核心方法createDataSource
protected DataSource createDataSource() throws SQLException { ... synchronized (this) { ... PoolableConnectionFactory poolableConnectionFactory; try { poolableConnectionFactory = <span style="color:#ff0000;"><strong>createPoolableConnectionFactory</strong></span>( driverConnectionFactory); ... } catch (SQLException se) { throw se; } ... if (success) { // create a pool for our connections <span style="color:#ff0000;"><strong>createConnectionPool</strong></span>(poolableConnectionFactory); } ... try { dataSource = <span style="color:#ff0000;"><strong>createDataSourceInstance</strong></span>(); ... } catch (SQLException se) { ... } ... <span style="color:#ff0000;">startPoolMaintenance</span>(); return dataSource; } }用createPoolableConnectionFactory方法构造一个PoolableConnectionFactory,然后createConnectionPool方法用该PoolableConnectionFactory构造饼初始化connectionPool变量。
createDataSourceInstance方法用上面构造好的connectionPool构造PoolingDataSource作为dataSource变量。
connectionPool(GenericObjectPool<PoolableConnection>,构造方法new GenericObjectPool<>)
dataSource(PoolingDataSource<PoolableConnection>,构造方法new PoolingDataSource<>(connectionPool))。
最后startPoolMaintenance开启Evictor任务,如果timeBetweenEvictionRunsMillis有设置的话。
可以把PoolingDataSource看作GenericObjectPool的包装,BasicDataSource的getConnection最终还是从GenericObjectPool中拿对象。
/** * Create (if necessary) and return a connection to the database. * * @throws SQLException if a database access error occurs * @return a database connection */ @Override public Connection getConnection() throws SQLException { if (Utils.IS_SECURITY_ENABLED) { PrivilegedExceptionAction<Connection> action = new PaGetConnection(); try { return AccessController.doPrivileged(action); } catch (PrivilegedActionException e) { Throwable cause = e.getCause(); if (cause instanceof SQLException) { throw (SQLException) cause; } throw new SQLException(e); } } return createDataSource().getConnection(); }这里的createDataSource返回的就是PoolingDataSource,它的getConnection方法如下:
/** * Return a {@link java.sql.Connection} from my pool, * according to the contract specified by {@link ObjectPool#borrowObject}. */ @Override public Connection getConnection() throws SQLException { try { C conn = _pool.borrowObject(); if (conn == null) { return null; } return new PoolGuardConnectionWrapper<>(conn); } catch(SQLException e) { ... } }也是从_pool这个变量中调用borrowObject拿对象,这个_pool对象就是上面说的GenericObjectPool,所以最终还是调用GenericObjectPool的borrowObject方法拿对象。
0 0
- pool(五)——BasicDataSource
- BasicDataSource
- BasicDataSource
- org/apache/commons/dpcp/BasicDataSource和org/apache/commons/pool/impl/GenericObjectPool
- pool(一)——入门
- pool(三)——Timer
- pool(四)——EvictionTimer
- pool(六)——JedisPool
- tomcat6报错——java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
- library cache —— latch: shared pool
- pool(二)——动手入门
- python 多进程 —— multiprocessing.Pool
- 关于shared pool的深入探讨(五)
- Oracle——Default pool 之cache特性 以及 测试default pool使用效果实验分享
- 数据源BasicDataSource
- POOL
- pool
- Pool
- Debian8下python3和python2同时安装如何使用pip
- shp文件保存到mysql
- shell从路径从取出文件名字
- 2016 PSUT Coding Marathon(gym100989)
- 【BZOJ】2301 Problem b
- pool(五)——BasicDataSource
- TypeError:First argument must be file descriptor
- 计算日期前一天,后一天
- javaweb 1
- Hibernate总结(五)--之多对多操作
- android中存储的一些步骤
- 关于kubernetes 的 cluster IP , node IP ,container IP , 和 VIP
- javaweb 2
- ACM知识点 之 贪心(5)最小区间覆盖问题