扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在C3p0构建时,有驱动相关信息及数据库连接池相关的属性设置,及连接的获取,今天我们先来看一下,驱动相关信息及数据库连接池相关的属性设置,在连接的获取。
从下面几句开始,
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了合浦免费建站欢迎大家使用!
Java代码
cpDSource = new ComboPooledDataSource();
//设置DriverManagerDataSource驱动相关信息
cpDSource.setDriverClass(props.getProperty("driver"));
cpDSource.setJdbcUrl(props.getProperty("url"));
cpDSource.setUser(props.getProperty("user"));
cpDSource.setPassword(props.getProperty("password"));
//AbstractComboPooledDataSource的两个关键内部成员DriverManagerDataSource,WrapperConnectionPoolDataSource
Java代码下载
public AbstractComboPooledDataSource(boolean autoregister)
{
//
super(autoregister);
//新建驱动数据源管理器
dmds = new DriverManagerDataSource();
//新建数据库连接池
wcpds = new WrapperConnectionPoolDataSource();
//设置数据连接池的数据源驱动管理器
wcpds.setNestedDataSource(dmds);
try
{
setConnectionPoolDataSource(wcpds);
}
catch(PropertyVetoException e)
{
logger.log(MLevel.WARNING, "Hunh??? This can't happen. We haven't set up any listeners to veto the property change yet!", e);
throw new RuntimeException((new StringBuilder()).append("Hunh??? This can't happen. We haven't set up any listeners to veto the property change yet! ").append(e).toString());
}
setUpPropertyEvents();
}
}
//设置driverClass
public void setDriverClass(String driverClass)
throws PropertyVetoException
{
dmds.setDriverClass(driverClass);
}
//设置jdbcUrl
public void setJdbcUrl(String jdbcUrl)
{
if(diff(dmds.getJdbcUrl(), jdbcUrl))
{
dmds.setJdbcUrl(jdbcUrl);
resetPoolManager(false);
}
}
//设置user
public void setUser(String user)
{
if(diff(dmds.getUser(), user))
{
dmds.setUser(user);
resetPoolManager(false);
}
}
//设置password
public void setPassword(String password)
{
if(diff(dmds.getPassword(), password))
{
dmds.setPassword(password);
resetPoolManager(false);
}
}
//设置WrapperConnectionPoolDataSource相关属性
Java代码 下载
cpDSource.setInitialPoolSize(5);
cpDSource.setMaxPoolSize(30);
cpDSource.setMinPoolSize(5);
cpDSource.setMaxStatements(100);
cpDSource.setIdleConnectionTestPeriod(60);
cpDSource.setBreakAfterAcquireFailure(false);
cpDSource.setAcquireRetryAttempts(30);
cpDSource.setTestConnectionOnCheckout(false);
//设置连接失败尝试连接数
Java代码
public void setAcquireRetryAttempts(int acquireRetryAttempts)
{
if(diff(wcpds.getAcquireRetryAttempts(), acquireRetryAttempts))
{
wcpds.setAcquireRetryAttempts(acquireRetryAttempts);
resetPoolManager(false);
}
}
public int getAcquireRetryDelay()
{
return wcpds.getAcquireRetryDelay();
}
public void setAcquireRetryDelay(int acquireRetryDelay)
{
if(diff(wcpds.getAcquireRetryDelay(), acquireRetryDelay))
{
wcpds.setAcquireRetryDelay(acquireRetryDelay);
resetPoolManager(false);
}
}
public boolean isAutoCommitOnClose()
{
return wcpds.isAutoCommitOnClose();
}
//设置是否自动提交
public void setAutoCommitOnClose(boolean autoCommitOnClose)
{
if(diff(wcpds.isAutoCommitOnClose(), autoCommitOnClose))
{
wcpds.setAutoCommitOnClose(autoCommitOnClose);
resetPoolManager(false);
}
}
public int getInitialPoolSize()
{
return wcpds.getInitialPoolSize();
}
//连接池初始化大小
public void setInitialPoolSize(int initialPoolSize)
{
if(diff(wcpds.getInitialPoolSize(), initialPoolSize))
{
wcpds.setInitialPoolSize(initialPoolSize);
resetPoolManager(false);
}
}
下载
public int getMaxIdleTime()
{
return wcpds.getMaxIdleTime();
}
//maxIdleTime
public void setMaxIdleTime(int maxIdleTime)
{
if(diff(wcpds.getMaxIdleTime(), maxIdleTime))
{
wcpds.setMaxIdleTime(maxIdleTime);
resetPoolManager(false);
}
}
//maxPoolSize
public void setMaxPoolSize(int maxPoolSize)
{
if(diff(wcpds.getMaxPoolSize(), maxPoolSize))
{
wcpds.setMaxPoolSize(maxPoolSize);
resetPoolManager(false);
}
}
//maxStatements
public void setMaxStatements(int maxStatements)
{
if(diff(wcpds.getMaxStatements(), maxStatements))
{
wcpds.setMaxStatements(maxStatements);
resetPoolManager(false);
}
}
从上面可以看出cpDSource初始化driver相关属性,是初始化数据源驱动管理器DriverManagerDataSource的属性;初始化poolConnection相关属性,是初始化数据库连接池包装类WrapperConnectionPoolDataSource的属性。
再看连接的获取,从下面一句开始,
Java代码
con = cpDSource.getConnection();
此方法在ComboPooledDataSource和其父类中都没,追溯到AbstractComboPooledDataSource的
父类AbstractPoolBackedDataSource
//AbstractPoolBackedDataSource
Java代码
public abstract class AbstractPoolBackedDataSource extends PoolBackedDataSourceBase
implements PooledDataSource
{
public Connection getConnection()
throws SQLException
{
//获取数据库连接池管理器
PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();
//从数据库连接池,返回数据库连接
return pc.getConnection();
}
}
先看获取数据库连接池管理器
//获取数据库连接池管理器
PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();
//获取数据库连接池管理器
下载
Java代码
private synchronized C3P0PooledConnectionPoolManager getPoolManager()
throws SQLException
{
if(poolManager == null)
{
//获取数据源数据库连接池
ConnectionPoolDataSource cpds = assertCpds();
//构建数据库连接池管理器
poolManager = new C3P0PooledConnectionPoolManager(cpds, null, null, getNumHelperThreads(), getIdentityToken(), getDataSourceName());
if(logger.isLoggable(MLevel.INFO))
logger.info((new StringBuilder()).append("Initializing c3p0 pool... ").append(toString(true)).toString());
}
return poolManager;
}
//确定数据源数据库连接池
private synchronized ConnectionPoolDataSource assertCpds()
throws SQLException
{
if(is_closed)
throw new SQLException((new StringBuilder()).append(this).append(" has been closed() -- you can no longer use it.").toString());
//获取数据源数据库连接池
ConnectionPoolDataSource out = getConnectionPoolDataSource();
if(out == null)
throw new SQLException("Attempted to use an uninitialized PoolBackedDataSource. Please call setConnectionPoolDataSource( ... ) to initialize.");
else
return out;
}
//PoolBackedDataSourceBase
Java代码
public class PoolBackedDataSourceBase extends IdentityTokenResolvable
implements Referenceable, Serializable
{
//获取数据源数据库连接池
public synchronized ConnectionPoolDataSource getConnectionPoolDataSource()
{
return connectionPoolDataSource;
}
public synchronized void setConnectionPoolDataSource(ConnectionPoolDataSource connectionPoolDataSource)
throws PropertyVetoException
{
ConnectionPoolDataSource oldVal = this.connectionPoolDataSource;
if(!eqOrBothNull(oldVal, connectionPoolDataSource))
vcs.fireVetoableChange("connectionPoolDataSource", oldVal, connectionPoolDataSource);
this.connectionPoolDataSource = connectionPoolDataSource;
if(!eqOrBothNull(oldVal, connectionPoolDataSource))
pcs.firePropertyChange("connectionPoolDataSource", oldVal, connectionPoolDataSource);
}
}
这个数据源数据连接池是什么呢?还记得我们前面,有讲过AbstractComboPooledDataSource的构造有这么一段
Java代码下载
public AbstractComboPooledDataSource(boolean autoregister)
{
super(autoregister);
dmds = new DriverManagerDataSource();
wcpds = new WrapperConnectionPoolDataSource();
wcpds.setNestedDataSource(dmds);
try
{
//设置数据源数据库连接池为WrapperConnectionPoolDataSource
setConnectionPoolDataSource(wcpds);
}
}
现在回到getPoolManager的构建数据库连接池管理器这一句
Java代码
poolManager = new C3P0PooledConnectionPoolManager(cpds, null, null, getNumHelperThreads(), getIdentityToken(), getDataSourceName());
//C3P0PooledConnectionPoolManager
Java代码
public final class C3P0PooledConnectionPoolManager
{
private static final boolean POOL_EVENT_SUPPORT = false;
private static final CoalesceChecker COALESCE_CHECKER;
static final Coalescer COALESCER;
static final int DFLT_NUM_TASK_THREADS_PER_DATA_SOURCE = 3;
ThreadPoolAsynchronousRunner taskRunner;//
ThreadPoolAsynchronousRunner deferredStatementDestroyer;
Timer timer;
ResourcePoolFactory rpfact;
Map authsToPools;
final ConnectionPoolDataSource cpds;
final Map propNamesToReadMethods;
final Map flatPropertyOverrides;
final Map userOverrides;
final DbAuth defaultAuth;
final String parentDataSourceIdentityToken;
final String parentDataSourceName;
int num_task_threads;
static
{
COALESCE_CHECKER = IdentityTokenizedCoalesceChecker.INSTANCE;
COALESCER = CoalescerFactory.createCoalescer(COALESCE_CHECKER, true, false);
}
//初始化C3P0PooledConnectionPoolManager,cpds为WrapperConnectionPoolDataSource
public C3P0PooledConnectionPoolManager(ConnectionPoolDataSource cpds, Map flatPropertyOverrides, Map forceUserOverrides, int num_task_threads, String parentDataSourceIdentityToken, String parentDataSourceName)
throws SQLException
{
//任务线程数
this.num_task_threads = 3;
try
{
this.cpds = cpds;//初始化数据库连接池
this.flatPropertyOverrides = flatPropertyOverrides;
this.num_task_threads = num_task_threads;
this.parentDataSourceIdentityToken = parentDataSourceIdentityToken;
this.parentDataSourceName = parentDataSourceName;
DbAuth auth = null;
if(flatPropertyOverrides != null)
{
String overrideUser = (String)flatPropertyOverrides.get("overrideDefaultUser");
String overridePassword = (String)flatPropertyOverrides.get("overrideDefaultPassword");
if(overrideUser == null)
{
overrideUser = (String)flatPropertyOverrides.get("user");
overridePassword = (String)flatPropertyOverrides.get("password");
}
if(overrideUser != null)
auth = new DbAuth(overrideUser, overridePassword);
}
if(auth == null)
//初始化数据库验证
auth = C3P0ImplUtils.findAuth(cpds);
defaultAuth = auth;
Map tmp = new HashMap();
BeanInfo bi = Introspector.getBeanInfo(cpds.getClass());
PropertyDescriptor pds[] = bi.getPropertyDescriptors();
PropertyDescriptor pd = null;
int i = 0;
for(int len = pds.length; i < len; i++)
{ 下载
pd = pds[i];
String name = pd.getName();
Method m = pd.getReadMethod();
if(m != null)
tmp.put(name, m);
}
propNamesToReadMethods = tmp;
if(forceUserOverrides == null)
{
Method uom = (Method)propNamesToReadMethods.get("userOverridesAsString");
if(uom != null)
{
String uoas = (String)uom.invoke(cpds, (Object[])null);
Map uo = C3P0ImplUtils.parseUserOverridesAsString(uoas);
userOverrides = uo;
} else
{
userOverrides = Collections.EMPTY_MAP;
}
} else
{
userOverrides = forceUserOverrides;
}
poolsInit();
}
catch(Exception e)
{
logger.log(MLevel.FINE, null, e);
throw SqlUtils.toSQLException(e);
}
}
}
//连接池初始化
private void poolsInit()
{
boolean privilege_spawned_threads = getPrivilegeSpawnedThreads();
String contextClassLoaderSource = getContextClassLoaderSource();
class _cls1ContextClassLoaderPoolsInitThread extends Thread
{
public void run()
{
//
maybePrivilegedPoolsInit(privilege_spawned_threads);
}
final boolean val$privilege_spawned_threads;
final C3P0PooledConnectionPoolManager this$0;
_cls1ContextClassLoaderPoolsInitThread(boolean flag)
{
this.this$0 = C3P0PooledConnectionPoolManager.this;
privilege_spawned_threads = flag;
super();
setContextClassLoader(ccl);
}
}
try
{
if("library".equalsIgnoreCase(contextClassLoaderSource))
{
//
Thread t = new _cls1ContextClassLoaderPoolsInitThread(privilege_spawned_threads);
t.start();
t.join();
} else
if("none".equalsIgnoreCase(contextClassLoaderSource))
{
Thread t = new _cls1ContextClassLoaderPoolsInitThread(privilege_spawned_threads);
t.start();
t.join();
} else
{
if(logger.isLoggable(MLevel.WARNING) && !"caller".equalsIgnoreCase(contextClassLoaderSource))
logger.log(MLevel.WARNING, (new StringBuilder()).append("Unknown contextClassLoaderSource: ").append(contextClassLoaderSource).append(" -- should be 'caller', 'library', or 'none'. Using default value 'caller'.").toString());
maybePrivilegedPoolsInit(privilege_spawned_threads);
}
}
}
private void maybePrivilegedPoolsInit(boolean privilege_spawned_threads)
{
if(privilege_spawned_threads)
{
PrivilegedAction privilegedPoolsInit = new PrivilegedAction() {
public Void run()
{
//委托给_poolsInit
_poolsInit();
return null;
}
public volatile Object run()
{
return run();
}
final C3P0PooledConnectionPoolManager this$0;
{
this.this$0 = C3P0PooledConnectionPoolManager.this;
super();
}
};
AccessController.doPrivileged(privilegedPoolsInit);
} else
{
_poolsInit();
}
}
//终于找个了poolsInit的关键,初始化定时任务调度器,及死锁检测线程,及延时死锁检测线程
private synchronized void _poolsInit()
{
String idStr = idString();
timer = new Timer((new StringBuilder()).append(idStr).append("-AdminTaskTimer").toString(), true);
int matt = getMaxAdministrativeTaskTime();
//创建任务线程调度器
taskRunner = createTaskRunner(num_task_threads, matt, timer, (new StringBuilder()).append(idStr).append("-HelperThread").toString());
int num_deferred_close_threads = getStatementCacheNumDeferredCloseThreads();
if(num_deferred_close_threads > 0)
deferredStatementDestroyer = createTaskRunner(num_deferred_close_threads, matt, timer, (new StringBuilder()).append(idStr).append("-DeferredStatementDestroyerThread").toString());
else
deferredStatementDestroyer = null;
rpfact = BasicResourcePoolFactory.createNoEventSupportInstance(taskRunner, timer);
authsToPools = new HashMap();
}
从上面可以看出getPoolManager()实际上,是初始化数据库连接池管理器C3P0PooledConnectionPoolManager,初始化C3P0PooledConnectionPoolManager的
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流