/*
* Closes all active and idle connections in the pool
*/publicvoidforceCloseAll(){// synchronized给对象加锁synchronized(state){
expectedConnectionTypeCode =assembleConnectionTypeCode(dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());for(int i = state.activeConnections.size(); i >0; i--){try{
PooledConnection conn = state.activeConnections.remove(i -1);
conn.invalidate();
Connection realConn = conn.getRealConnection();if(!realConn.getAutoCommit()){
realConn.rollback();}
realConn.close();}catch(Exception e){// ignore}}for(int i = state.idleConnections.size(); i >0; i--){try{
PooledConnection conn = state.idleConnections.remove(i -1);
conn.invalidate();
Connection realConn = conn.getRealConnection();if(!realConn.getAutoCommit()){
realConn.rollback();}
realConn.close();}catch(Exception e){// ignore}}}if(log.isDebugEnabled()){
log.debug("PooledDataSource forcefully closed/removed all connections.");}}protectedvoidpushConnection(PooledConnection conn)throws SQLException {synchronized(state){
state.activeConnections.remove(conn);if(conn.isValid()){if(state.idleConnections.size()< poolMaximumIdleConnections && conn.getConnectionTypeCode()== expectedConnectionTypeCode){
state.accumulatedCheckoutTime += conn.getCheckoutTime();if(!conn.getRealConnection().getAutoCommit()){
conn.getRealConnection().rollback();}
PooledConnection newConn =newPooledConnection(conn.getRealConnection(),this);
state.idleConnections.add(newConn);
newConn.setCreatedTimestamp(conn.getCreatedTimestamp());
newConn.setLastUsedTimestamp(conn.getLastUsedTimestamp());
conn.invalidate();if(log.isDebugEnabled()){
log.debug("Returned connection "+ newConn.getRealHashCode()+" to pool.");}
state.notifyAll();}else{
state.accumulatedCheckoutTime += conn.getCheckoutTime();if(!conn.getRealConnection().getAutoCommit()){
conn.getRealConnection().rollback();}
conn.getRealConnection().close();if(log.isDebugEnabled()){
log.debug("Closed connection "+ conn.getRealHashCode()+".");}
conn.invalidate();}}else{if(log.isDebugEnabled()){
log.debug("A bad connection ("+ conn.getRealHashCode()+") attempted to return to the pool, discarding connection.");}
state.badConnectionCount++;}}}
PooledDataSourceFactory源码
package org.apache.ibatis.datasource.pooled;import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;/**
* @author Clinton Begin
*/publicclassPooledDataSourceFactoryextendsUnpooledDataSourceFactory{publicPooledDataSourceFactory(){this.dataSource =newPooledDataSource();}}