千家信息网

C3P0属性设置和数据库连接池的获取

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,在C3p0构建时,有驱动相关信息及数据库连接池相关的属性设置,及连接的获取,今天我们先来看一下,驱动相关信息及数据库连接池相关的属性设置,在连接的获取。从下面几句开始,Java代码 cpDSource
千家信息网最后更新 2026年11月02日C3P0属性设置和数据库连接池的获取

在C3p0构建时,有驱动相关信息及数据库连接池相关的属性设置,及连接的获取,今天我们先来看一下,驱动相关信息及数据库连接池相关的属性设置,在连接的获取。
从下面几句开始,

Java代码

  1. cpDSource = new ComboPooledDataSource();

  2. //设置DriverManagerDataSource驱动相关信息

  3. cpDSource.setDriverClass(props.getProperty("driver"));

  4. cpDSource.setJdbcUrl(props.getProperty("url"));

  5. cpDSource.setUser(props.getProperty("user"));

  6. cpDSource.setPassword(props.getProperty("password"));


//AbstractComboPooledDataSource的两个关键内部成员DriverManagerDataSource,WrapperConnectionPoolDataSource

Java代码下载

  1. public AbstractComboPooledDataSource(boolean autoregister)

  2. {

  3. //

  4. super(autoregister);

  5. //新建驱动数据源管理器

  6. dmds = new DriverManagerDataSource();

  7. //新建数据库连接池

  8. wcpds = new WrapperConnectionPoolDataSource();

  9. //设置数据连接池的数据源驱动管理器

  10. wcpds.setNestedDataSource(dmds);

  11. try

  12. {

  13. setConnectionPoolDataSource(wcpds);

  14. }

  15. catch(PropertyVetoException e)

  16. {

  17. logger.log(MLevel.WARNING, "Hunh??? This can't happen. We haven't set up any listeners to veto the property change yet!", e);

  18. 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());

  19. }

  20. setUpPropertyEvents();

  21. }

  22. }

  23. //设置driverClass

  24. public void setDriverClass(String driverClass)

  25. throws PropertyVetoException

  26. {

  27. dmds.setDriverClass(driverClass);

  28. }

  29. //设置jdbcUrl

  30. public void setJdbcUrl(String jdbcUrl)

  31. {

  32. if(diff(dmds.getJdbcUrl(), jdbcUrl))

  33. {

  34. dmds.setJdbcUrl(jdbcUrl);

  35. resetPoolManager(false);

  36. }

  37. }

  38. //设置user

  39. public void setUser(String user)

  40. {

  41. if(diff(dmds.getUser(), user))

  42. {

  43. dmds.setUser(user);

  44. resetPoolManager(false);

  45. }

  46. }

  47. //设置password

  48. public void setPassword(String password)

  49. {

  50. if(diff(dmds.getPassword(), password))

  51. {

  52. dmds.setPassword(password);

  53. resetPoolManager(false);

  54. }

  55. }


//设置WrapperConnectionPoolDataSource相关属性

Java代码 下载

  1. cpDSource.setInitialPoolSize(5);

  2. cpDSource.setMaxPoolSize(30);

  3. cpDSource.setMinPoolSize(5);

  4. cpDSource.setMaxStatements(100);

  5. cpDSource.setIdleConnectionTestPeriod(60);

  6. cpDSource.setBreakAfterAcquireFailure(false);

  7. cpDSource.setAcquireRetryAttempts(30);

  8. cpDSource.setTestConnectionOnCheckout(false);


//设置连接失败尝试连接数

Java代码

  1. public void setAcquireRetryAttempts(int acquireRetryAttempts)

  2. {

  3. if(diff(wcpds.getAcquireRetryAttempts(), acquireRetryAttempts))

  4. {

  5. wcpds.setAcquireRetryAttempts(acquireRetryAttempts);

  6. resetPoolManager(false);

  7. }

  8. }

  9. public int getAcquireRetryDelay()

  10. {

  11. return wcpds.getAcquireRetryDelay();

  12. }

  13. public void setAcquireRetryDelay(int acquireRetryDelay)

  14. {

  15. if(diff(wcpds.getAcquireRetryDelay(), acquireRetryDelay))

  16. {

  17. wcpds.setAcquireRetryDelay(acquireRetryDelay);

  18. resetPoolManager(false);

  19. }

  20. }

  21. public boolean isAutoCommitOnClose()

  22. {

  23. return wcpds.isAutoCommitOnClose();

  24. }

  25. //设置是否自动提交

  26. public void setAutoCommitOnClose(boolean autoCommitOnClose)

  27. {

  28. if(diff(wcpds.isAutoCommitOnClose(), autoCommitOnClose))

  29. {

  30. wcpds.setAutoCommitOnClose(autoCommitOnClose);

  31. resetPoolManager(false);

  32. }

  33. }

  34. public int getInitialPoolSize()

  35. {

  36. return wcpds.getInitialPoolSize();

  37. }

  38. //连接池初始化大小

  39. public void setInitialPoolSize(int initialPoolSize)

  40. {

  41. if(diff(wcpds.getInitialPoolSize(), initialPoolSize))

  42. {

  43. wcpds.setInitialPoolSize(initialPoolSize);

  44. resetPoolManager(false);

  45. }

  46. }

  47. 下载

  48. public int getMaxIdleTime()

  49. {

  50. return wcpds.getMaxIdleTime();

  51. }

  52. //maxIdleTime

  53. public void setMaxIdleTime(int maxIdleTime)

  54. {

  55. if(diff(wcpds.getMaxIdleTime(), maxIdleTime))

  56. {

  57. wcpds.setMaxIdleTime(maxIdleTime);

  58. resetPoolManager(false);

  59. }

  60. }

  61. //maxPoolSize

  62. public void setMaxPoolSize(int maxPoolSize)

  63. {

  64. if(diff(wcpds.getMaxPoolSize(), maxPoolSize))

  65. {

  66. wcpds.setMaxPoolSize(maxPoolSize);

  67. resetPoolManager(false);

  68. }

  69. }

  70. //maxStatements

  71. public void setMaxStatements(int maxStatements)

  72. {

  73. if(diff(wcpds.getMaxStatements(), maxStatements))

  74. {

  75. wcpds.setMaxStatements(maxStatements);

  76. resetPoolManager(false);

  77. }

  78. }


从上面可以看出cpDSource初始化driver相关属性,是初始化数据源驱动管理器DriverManagerDataSource的属性;初始化poolConnection相关属性,是初始化数据库连接池包装类WrapperConnectionPoolDataSource的属性。

再看连接的获取,从下面一句开始,

Java代码

  1. con = cpDSource.getConnection();


此方法在ComboPooledDataSource和其父类中都没,追溯到AbstractComboPooledDataSource的
父类AbstractPoolBackedDataSource
//AbstractPoolBackedDataSource

Java代码

  1. public abstract class AbstractPoolBackedDataSource extends PoolBackedDataSourceBase

  2. implements PooledDataSource

  3. {

  4. public Connection getConnection()

  5. throws SQLException

  6. {

  7. //获取数据库连接池管理器

  8. PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();

  9. //从数据库连接池,返回数据库连接

  10. return pc.getConnection();

  11. }

  12. }


先看获取数据库连接池管理器
//获取数据库连接池管理器
PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();

//获取数据库连接池管理器
下载

Java代码

  1. private synchronized C3P0PooledConnectionPoolManager getPoolManager()

  2. throws SQLException

  3. {

  4. if(poolManager == null)

  5. {

  6. //获取数据源数据库连接池

  7. ConnectionPoolDataSource cpds = assertCpds();

  8. //构建数据库连接池管理器

  9. poolManager = new C3P0PooledConnectionPoolManager(cpds, null, null, getNumHelperThreads(), getIdentityToken(), getDataSourceName());

  10. if(logger.isLoggable(MLevel.INFO))

  11. logger.info((new StringBuilder()).append("Initializing c3p0 pool... ").append(toString(true)).toString());

  12. }

  13. return poolManager;

  14. }

  15. //确定数据源数据库连接池

  16. private synchronized ConnectionPoolDataSource assertCpds()

  17. throws SQLException

  18. {

  19. if(is_closed)

  20. throw new SQLException((new StringBuilder()).append(this).append(" has been closed() -- you can no longer use it.").toString());

  21. //获取数据源数据库连接池

  22. ConnectionPoolDataSource out = getConnectionPoolDataSource();

  23. if(out == null)

  24. throw new SQLException("Attempted to use an uninitialized PoolBackedDataSource. Please call setConnectionPoolDataSource( ... ) to initialize.");

  25. else

  26. return out;

  27. }


//PoolBackedDataSourceBase

Java代码

  1. public class PoolBackedDataSourceBase extends IdentityTokenResolvable

  2. implements Referenceable, Serializable

  3. {

  4. //获取数据源数据库连接池

  5. public synchronized ConnectionPoolDataSource getConnectionPoolDataSource()

  6. {

  7. return connectionPoolDataSource;

  8. }

  9. public synchronized void setConnectionPoolDataSource(ConnectionPoolDataSource connectionPoolDataSource)

  10. throws PropertyVetoException

  11. {

  12. ConnectionPoolDataSource oldVal = this.connectionPoolDataSource;

  13. if(!eqOrBothNull(oldVal, connectionPoolDataSource))

  14. vcs.fireVetoableChange("connectionPoolDataSource", oldVal, connectionPoolDataSource);

  15. this.connectionPoolDataSource = connectionPoolDataSource;

  16. if(!eqOrBothNull(oldVal, connectionPoolDataSource))

  17. pcs.firePropertyChange("connectionPoolDataSource", oldVal, connectionPoolDataSource);

  18. }

  19. }


这个数据源数据连接池是什么呢?还记得我们前面,有讲过AbstractComboPooledDataSource的构造有这么一段

Java代码下载

  1. public AbstractComboPooledDataSource(boolean autoregister)

  2. {

  3. super(autoregister);

  4. dmds = new DriverManagerDataSource();

  5. wcpds = new WrapperConnectionPoolDataSource();

  6. wcpds.setNestedDataSource(dmds);

  7. try

  8. {

  9. //设置数据源数据库连接池为WrapperConnectionPoolDataSource

  10. setConnectionPoolDataSource(wcpds);

  11. }

  12. }


现在回到getPoolManager的构建数据库连接池管理器这一句

Java代码

  1. poolManager = new C3P0PooledConnectionPoolManager(cpds, null, null, getNumHelperThreads(), getIdentityToken(), getDataSourceName());


//C3P0PooledConnectionPoolManager

Java代码

  1. public final class C3P0PooledConnectionPoolManager

  2. {

  3. private static final boolean POOL_EVENT_SUPPORT = false;

  4. private static final CoalesceChecker COALESCE_CHECKER;

  5. static final Coalescer COALESCER;

  6. static final int DFLT_NUM_TASK_THREADS_PER_DATA_SOURCE = 3;

  7. ThreadPoolAsynchronousRunner taskRunner;//

  8. ThreadPoolAsynchronousRunner deferredStatementDestroyer;

  9. Timer timer;

  10. ResourcePoolFactory rpfact;

  11. Map authsToPools;

  12. final ConnectionPoolDataSource cpds;

  13. final Map propNamesToReadMethods;

  14. final Map flatPropertyOverrides;

  15. final Map userOverrides;

  16. final DbAuth defaultAuth;

  17. final String parentDataSourceIdentityToken;

  18. final String parentDataSourceName;

  19. int num_task_threads;

  20. static

  21. {

  22. COALESCE_CHECKER = IdentityTokenizedCoalesceChecker.INSTANCE;

  23. COALESCER = CoalescerFactory.createCoalescer(COALESCE_CHECKER, true, false);

  24. }

  25. //初始化C3P0PooledConnectionPoolManager,cpds为WrapperConnectionPoolDataSource

  26. public C3P0PooledConnectionPoolManager(ConnectionPoolDataSource cpds, Map flatPropertyOverrides, Map forceUserOverrides, int num_task_threads, String parentDataSourceIdentityToken, String parentDataSourceName)

  27. throws SQLException

  28. {

  29. //任务线程数

  30. this.num_task_threads = 3;

  31. try

  32. {

  33. this.cpds = cpds;//初始化数据库连接池

  34. this.flatPropertyOverrides = flatPropertyOverrides;

  35. this.num_task_threads = num_task_threads;

  36. this.parentDataSourceIdentityToken = parentDataSourceIdentityToken;

  37. this.parentDataSourceName = parentDataSourceName;

  38. DbAuth auth = null;

  39. if(flatPropertyOverrides != null)

  40. {

  41. String overrideUser = (String)flatPropertyOverrides.get("overrideDefaultUser");

  42. String overridePassword = (String)flatPropertyOverrides.get("overrideDefaultPassword");

  43. if(overrideUser == null)

  44. {

  45. overrideUser = (String)flatPropertyOverrides.get("user");

  46. overridePassword = (String)flatPropertyOverrides.get("password");

  47. }

  48. if(overrideUser != null)

  49. auth = new DbAuth(overrideUser, overridePassword);

  50. }

  51. if(auth == null)

  52. //初始化数据库验证

  53. auth = C3P0ImplUtils.findAuth(cpds);

  54. defaultAuth = auth;

  55. Map tmp = new HashMap();

  56. BeanInfo bi = Introspector.getBeanInfo(cpds.getClass());

  57. PropertyDescriptor pds[] = bi.getPropertyDescriptors();

  58. PropertyDescriptor pd = null;

  59. int i = 0;

  60. for(int len = pds.length; i < len; i++)

  61. { 下载

  62. pd = pds[i];

  63. String name = pd.getName();

  64. Method m = pd.getReadMethod();

  65. if(m != null)

  66. tmp.put(name, m);

  67. }

  68. propNamesToReadMethods = tmp;

  69. if(forceUserOverrides == null)

  70. {

  71. Method uom = (Method)propNamesToReadMethods.get("userOverridesAsString");

  72. if(uom != null)

  73. {

  74. String uoas = (String)uom.invoke(cpds, (Object[])null);

  75. Map uo = C3P0ImplUtils.parseUserOverridesAsString(uoas);

  76. userOverrides = uo;

  77. } else

  78. {

  79. userOverrides = Collections.EMPTY_MAP;

  80. }

  81. } else

  82. {

  83. userOverrides = forceUserOverrides;

  84. }

  85. poolsInit();

  86. }

  87. catch(Exception e)

  88. {

  89. logger.log(MLevel.FINE, null, e);

  90. throw SqlUtils.toSQLException(e);

  91. }

  92. }

  93. }

  94. //连接池初始化

  95. private void poolsInit()

  96. {

  97. boolean privilege_spawned_threads = getPrivilegeSpawnedThreads();

  98. String contextClassLoaderSource = getContextClassLoaderSource();

  99. class _cls1ContextClassLoaderPoolsInitThread extends Thread

  100. {

  101. public void run()

  102. {

  103. //

  104. maybePrivilegedPoolsInit(privilege_spawned_threads);

  105. }

  106. final boolean val$privilege_spawned_threads;

  107. final C3P0PooledConnectionPoolManager this$0;

  108. _cls1ContextClassLoaderPoolsInitThread(boolean flag)

  109. {

  110. this.this$0 = C3P0PooledConnectionPoolManager.this;

  111. privilege_spawned_threads = flag;

  112. super();

  113. setContextClassLoader(ccl);

  114. }

  115. }

  116. try

  117. {

  118. if("library".equalsIgnoreCase(contextClassLoaderSource))

  119. {

  120. //

  121. Thread t = new _cls1ContextClassLoaderPoolsInitThread(privilege_spawned_threads);

  122. t.start();

  123. t.join();

  124. } else

  125. if("none".equalsIgnoreCase(contextClassLoaderSource))

  126. {

  127. Thread t = new _cls1ContextClassLoaderPoolsInitThread(privilege_spawned_threads);

  128. t.start();

  129. t.join();

  130. } else

  131. {

  132. if(logger.isLoggable(MLevel.WARNING) && !"caller".equalsIgnoreCase(contextClassLoaderSource))

  133. logger.log(MLevel.WARNING, (new StringBuilder()).append("Unknown contextClassLoaderSource: ").append(contextClassLoaderSource).append(" -- should be 'caller', 'library', or 'none'. Using default value 'caller'.").toString());

  134. maybePrivilegedPoolsInit(privilege_spawned_threads);

  135. }

  136. }

  137. }

  138. private void maybePrivilegedPoolsInit(boolean privilege_spawned_threads)

  139. {

  140. if(privilege_spawned_threads)

  141. {

  142. PrivilegedAction privilegedPoolsInit = new PrivilegedAction() {

  143. public Void run()

  144. {

  145. //委托给_poolsInit

  146. _poolsInit();

  147. return null;

  148. }

  149. public volatile Object run()

  150. {

  151. return run();

  152. }

  153. final C3P0PooledConnectionPoolManager this$0;

  154. {

  155. this.this$0 = C3P0PooledConnectionPoolManager.this;

  156. super();

  157. }

  158. };

  159. AccessController.doPrivileged(privilegedPoolsInit);

  160. } else

  161. {

  162. _poolsInit();

  163. }

  164. }

  165. //终于找个了poolsInit的关键,初始化定时任务调度器,及死锁检测线程,及延时死锁检测线程

  166. private synchronized void _poolsInit()

  167. {

  168. String idStr = idString();

  169. timer = new Timer((new StringBuilder()).append(idStr).append("-AdminTaskTimer").toString(), true);

  170. int matt = getMaxAdministrativeTaskTime();

  171. //创建任务线程调度器

  172. taskRunner = createTaskRunner(num_task_threads, matt, timer, (new StringBuilder()).append(idStr).append("-HelperThread").toString());

  173. int num_deferred_close_threads = getStatementCacheNumDeferredCloseThreads();

  174. if(num_deferred_close_threads > 0)

  175. deferredStatementDestroyer = createTaskRunner(num_deferred_close_threads, matt, timer, (new StringBuilder()).append(idStr).append("-DeferredStatementDestroyerThread").toString());

  176. else

  177. deferredStatementDestroyer = null;

  178. rpfact = BasicResourcePoolFactory.createNoEventSupportInstance(taskRunner, timer);

  179. authsToPools = new HashMap();

  180. }


从上面可以看出getPoolManager()实际上,是初始化数据库连接池管理器C3P0PooledConnectionPoolManager,初始化C3P0PooledConnectionPoolManager的


数据 数据库 代码 管理 数据源 属性 驱动 线程 任务 信息 代码下载 关键 死锁 检测 调度 两个 大小 实际 实际上 成员 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳九邦互联网科技有限公司 科技金融是不是互联网金融 互联网科技行业发展 互联网科技的英文 互联网金融科技创新 广州紫鲸互联网科技 互联网 新科技 银川新华互联网科技学校地址 互联网系的金融科技公司 广州恒生互联网科技有限 全球顶尖互联网科技公司 苏州五指互联网络科技有限 湖南一路畅行互联网科技 中国互联网公司排名锤子科技 华中科技大学互联网的牛人 互联网风格科技公司名称 山东大美朱楼互联网科技有限公司 北京互联网科技类企业分布 互联网科技创业有什么好项目 互联网 科技节活动 微视频大赛 瑰夏咖啡 哈尔滨大商圈互联网科技有限公司 疫情对互联网科技公司影响 互联网巨头科技公司 九亚互联网科技 百单互联网科技有限公司 厦门千工互联网科技有限公司 长沙茂晟互联网科技有限公司 工业互联网山东科技大学 启辰互联网科技
0