之前我们学习的时候,每一次,当我们需要向数据里获取信息的时候,我们都会先 向底层获取一个Connection对象 ,然后用这个对象向数据库里面申请资源,执行完sql语句之后又 关掉资源 。如此反复,这是相当费时的一件事情。
不如将其优化一下,先创建一个数据库连接池,里面放很多 连接对象 ,用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
image.png

概念

其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器

好处

  1. 节约资源
  2. 用户访问高效

    实现

    标准接口:DataSource

    java.sql 包下的接口

    方法

  3. 获取连接 :getConnection()

  4. 归还连接 :如果连接对象Connection是从连接池中获取的,那么调用Connection.close() 方法,则不会再关闭连接了。而是归还连接

    实现技术

    我们一般不去实现它,有数据库厂商来实现

  5. C3P0 :数据库连接池技术

  6. Druid :数据库连接池实现技术,由阿里巴巴提供(全球最棒!

    C3P0数据库连接技术

  7. 导入jar包 c3p0-0.9.5.5.jar mchange-commons-java-0.2.19.jar | image.png | 导入jar包 c3p0-0.9.5.5.jar mchange-commons-java-0.2.19.jar | | —- | —- | | image.png | 选中—> 右键—> Add Library |

  1. 定义配置文件
    • 名称:c3p0.properties 或者 c3p0-config.xml
    • 路径:直接将文件放在src目录下即可

image.png

  1. <c3p0-config>
  2. <!-- 使用默认的配置读取连接池对象 -->
  3. <default-config>
  4. <!-- 连接参数 -->
  5. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  6. <property name="jdbcUrl">jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai</property>
  7. <property name="user">root</property>
  8. <property name="password">123456</property>
  9. <!-- 连接池参数 -->
  10. <property name="initialPoolSize">5</property>
  11. <property name="maxPoolSize">10</property>
  12. <!-- <property name="checkoutTimeout">3000</property>-->
  13. </default-config>
  14. <named-config name="otherc3p0">
  15. <!-- 连接参数 -->
  16. <property name="driverClass">com.mysql.jdbc.Driver</property>
  17. <property name="jdbcUrl">jdbc:mysql://localhost:3306/myfirsttest</property>
  18. <property name="user">root</property>
  19. <property name="password">123456</property>
  20. <!-- 连接池参数 -->
  21. <property name="initialPoolSize">5</property>
  22. <property name="maxPoolSize">8</property>
  23. <!-- <property name="checkoutTimeout">1000</property>-->
  24. </named-config>
  25. </c3p0-config>
  1. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  2. 获取连接:getConnection

    基本使用

    ```java package cn.itcast.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;

/**

  • c3p0的演示 */ public class C3P0Demo1 { public static void main(String[] args) throws SQLException {
    1. //1.创建数据库连接池对象
    2. DataSource ds = new ComboPooledDataSource();
    3. //2.获取连接对象
    4. Connection conn = ds.getConnection();
    5. //3.打印
    6. System.out.println(conn);
    } }

结果:

信息: MLog clients using java 1.4+ standard logging. 一月 21, 2021 12:11:21 下午 com.mchange.v2.c3p0.C3P0Registry 信息: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:07:46 -0800; debug? true; trace: 10] 一月 21, 2021 12:11:21 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 信息: Initializing c3p0 pool… com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge0z3af9qzzzl14qzxxk|6659c656, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0z3af9qzzzl14qzxxk|6659c656, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=**, password=**}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] com.mchange.v2.c3p0.impl.NewProxyConnection@c818063 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@3f0ee7cb]

Process finished with exit code 0

  1. <a name="iSn7b"></a>
  2. ## 基本验证
  3. <a name="jFwxr"></a>
  4. ### 验证maxPoolSize(最大连接数
  5. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2211273/1611202716945-f60bb06b-2dbe-490b-aeb1-c1a64108cad7.png#align=left&display=inline&height=218&margin=%5Bobject%20Object%5D&name=image.png&originHeight=303&originWidth=780&size=29946&status=done&style=none&width=561)<br />从c3p0-config.xml文件里可以看到最大连接数量是10个,咱们可以验证一下,for循环打印10个地址
  6. ```java
  7. package cn.itcast.datasource.c3p0;
  8. import com.mchange.v2.c3p0.ComboPooledDataSource;
  9. import javax.sql.DataSource;
  10. import java.sql.Connection;
  11. import java.sql.SQLException;
  12. /**
  13. * 连接池参数验证
  14. */
  15. public class C3P0Demo2 {
  16. public static void main(String[] args) throws SQLException {
  17. //获取DataSource
  18. DataSource ds = new ComboPooledDataSource();
  19. //2.获取连接
  20. for (int i = 1; i <=10 ; i++) {
  21. Connection conn = ds.getConnection();
  22. System.out.println(i+":"+conn);
  23. }
  24. }
  25. }
  26. 结果:
  27. "C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=51391:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar" cn.itcast.datasource.c3p0.C3P0Demo2
  28. 一月 21, 2021 12:19:59 下午 com.mchange.v2.log.MLog
  29. 信息: MLog clients using java 1.4+ standard logging.
  30. 一月 21, 2021 12:19:59 下午 com.mchange.v2.c3p0.C3P0Registry
  31. 信息: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:07:46 -0800; debug? true; trace: 10]
  32. 一月 21, 2021 12:19:59 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource
  33. 信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 3000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge0z3af9rb3mk107yr36|6659c656, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0z3af9rb3mk107yr36|6659c656, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
  34. 1:com.mchange.v2.c3p0.impl.NewProxyConnection@c818063 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@3f0ee7cb]
  35. 2:com.mchange.v2.c3p0.impl.NewProxyConnection@7d417077 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7dc36524]
  36. 3:com.mchange.v2.c3p0.impl.NewProxyConnection@2c8d66b2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@5a39699c]
  37. 4:com.mchange.v2.c3p0.impl.NewProxyConnection@56cbfb61 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1134affc]
  38. 5:com.mchange.v2.c3p0.impl.NewProxyConnection@129a8472 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1b0375b3]
  39. 6:com.mchange.v2.c3p0.impl.NewProxyConnection@2d209079 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6bdf28bb]
  40. 7:com.mchange.v2.c3p0.impl.NewProxyConnection@2752f6e2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@e580929]
  41. 8:com.mchange.v2.c3p0.impl.NewProxyConnection@7c75222b [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4c203ea1]
  42. 9:com.mchange.v2.c3p0.impl.NewProxyConnection@1d251891 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@48140564]
  43. 10:com.mchange.v2.c3p0.impl.NewProxyConnection@7c30a502 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@49e4cb85]
  44. Process finished with exit code 0

可以观察,是10个不同的地址
那么循环11次如何?
image.png
先是打印出10个地址,然后等待3秒开始报错

  • 等待3秒是因为xml文件里面有一个超时配置,最多不超过3秒

image.png
所以说,如果多余10个人 同时 过来从池子里拿连接(10个连接都拿走的同时还在申请),就会造成如上报错情况。
当然,因为我们取完没有归还连接,所以到第11个人来取依旧会报错(池子里没有了,
此时就要考虑:

  • 取完后 归还操作
  • 要根据实际情况可以改变xml里面maxPoolSize的值。

    验证归还操作close()方法

    ```java package cn.itcast.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;

/**

  • 连接池参数验证 */ public class C3P0Demo2 { public static void main(String[] args) throws SQLException {

    1. //获取DataSource
    2. DataSource ds = new ComboPooledDataSource();
    3. //2.获取连接
    4. for (int i = 1; i <=11 ; i++) {
    5. Connection conn = ds.getConnection();
    6. System.out.println(i+":"+conn);
    7. if (i==5){
    8. conn.close(); //归还连接到连接池中
    9. }
    10. }

    } }

结果:

“C:\Program Files\Java\jdk1.8.0_151\bin\java.exe” “-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=51440:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin” -Dfile.encoding=UTF-8 -classpath “C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar” cn.itcast.datasource.c3p0.C3P0Demo2 一月 21, 2021 12:26:43 下午 com.mchange.v2.log.MLog 信息: MLog clients using java 1.4+ standard logging. 一月 21, 2021 12:26:43 下午 com.mchange.v2.c3p0.C3P0Registry 信息: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:07:46 -0800; debug? true; trace: 10] 一月 21, 2021 12:26:43 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 信息: Initializing c3p0 pool… com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 3000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge0z3af9rjrd82y0i88|6659c656, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge0z3af9rjrd82y0i88|6659c656, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=**, password=**}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] 1:com.mchange.v2.c3p0.impl.NewProxyConnection@c818063 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@3f0ee7cb] 2:com.mchange.v2.c3p0.impl.NewProxyConnection@7d417077 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7dc36524] 3:com.mchange.v2.c3p0.impl.NewProxyConnection@2c8d66b2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@5a39699c] 4:com.mchange.v2.c3p0.impl.NewProxyConnection@56cbfb61 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1134affc] 5:com.mchange.v2.c3p0.impl.NewProxyConnection@129a8472 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1b0375b3] 6:com.mchange.v2.c3p0.impl.NewProxyConnection@6b71769e [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1b0375b3] 7:com.mchange.v2.c3p0.impl.NewProxyConnection@e580929 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1cd072a9] 8:com.mchange.v2.c3p0.impl.NewProxyConnection@4c203ea1 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@27f674d] 9:com.mchange.v2.c3p0.impl.NewProxyConnection@48140564 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@58ceff1] 10:com.mchange.v2.c3p0.impl.NewProxyConnection@49e4cb85 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@2133c8f8] 11:com.mchange.v2.c3p0.impl.NewProxyConnection@3ac3fd8b [wrapping: com.mysql.cj.jdbc.ConnectionImpl@5594a1b5]

Process finished with exit code 0

  1. 如上,从第五个人就开始归还连接了。所以第十一个可以从池子里拿到连接。地址相应也有重复的部分
  2. <a name="L0mwU"></a>
  3. ### 配置多个condig
  4. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2211273/1611218622162-12a45925-f93a-4afb-87c2-4e0ed48243e6.png#align=left&display=inline&height=240&margin=%5Bobject%20Object%5D&name=image.png&originHeight=254&originWidth=547&size=17957&status=done&style=none&width=516)<br />如图,和上这些块元素之后你就会发现,这里有两个config,一个默认default,一个命名named<br />展开来看,感觉内容大多也是相同的,只有个别不一样,那这些是干嘛用的?
  5. - 可以通过设置多个config,通过一个文件调用多个不同的数据源,操作不同的数据库
  6. - 如果你定义的字符串什么都不指定,什么都没传,则默认调用default-config。若指定name=""对应的值,则调用相应的named-config
  7. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2211273/1611219701486-4802ba65-d5a9-4c7b-96ca-62fc78dfd04c.png#align=left&display=inline&height=229&margin=%5Bobject%20Object%5D&name=image.png&originHeight=458&originWidth=1335&size=62925&status=done&style=none&width=667.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2211273/1611219635886-2c9b6061-ee8d-478a-b1b6-767aa2430ab8.png#align=left&display=inline&height=288&margin=%5Bobject%20Object%5D&name=image.png&originHeight=410&originWidth=941&size=39641&status=done&style=none&width=661)<br />我这里循环打印10次,但最大申请量只有8个,运行后如果到第9个报错,那么说明调用的就是名为otherc3p0的config。<br />果不其然。爷成功了✌
  8. ```java
  9. package cn.itcast.datasource.c3p0;
  10. import com.mchange.v2.c3p0.ComboPooledDataSource;
  11. import javax.sql.DataSource;
  12. import java.sql.Connection;
  13. import java.sql.SQLException;
  14. public class C3P0Demo2_1 {
  15. public static void main(String[] args) throws SQLException {
  16. //1.获取DataSource,使用默认配置config
  17. DataSource ds = new ComboPooledDataSource("otherc3p0");
  18. //2.获取连接
  19. for (int i = 1; i <=10 ; i++) {
  20. Connection conn = ds.getConnection();
  21. System.out.println(i+":"+conn);
  22. }
  23. }
  24. }
  25. 结果:
  26. "C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=51995:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar" cn.itcast.datasource.c3p0.C3P0Demo2_1
  27. 一月 21, 2021 4:59:30 下午 com.mchange.v2.log.MLog
  28. 信息: MLog clients using java 1.4+ standard logging.
  29. 一月 21, 2021 4:59:31 下午 com.mchange.v2.c3p0.C3P0Registry
  30. 信息: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:07:46 -0800; debug? true; trace: 10]
  31. 一月 21, 2021 4:59:31 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource
  32. 信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 1000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> otherc3p0, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge9huafa1akvzzqedaf|6659c656, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 8, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
  33. Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
  34. 1:com.mchange.v2.c3p0.impl.NewProxyConnection@c818063 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@3f0ee7cb]
  35. 2:com.mchange.v2.c3p0.impl.NewProxyConnection@7d417077 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@7dc36524]
  36. 3:com.mchange.v2.c3p0.impl.NewProxyConnection@2c8d66b2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@5a39699c]
  37. 4:com.mchange.v2.c3p0.impl.NewProxyConnection@56cbfb61 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1134affc]
  38. 5:com.mchange.v2.c3p0.impl.NewProxyConnection@129a8472 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@1b0375b3]
  39. 6:com.mchange.v2.c3p0.impl.NewProxyConnection@2d209079 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6bdf28bb]
  40. 7:com.mchange.v2.c3p0.impl.NewProxyConnection@2752f6e2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@e580929]
  41. 8:com.mchange.v2.c3p0.impl.NewProxyConnection@7c75222b [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4c203ea1]
  42. Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
  43. at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
  44. at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
  45. at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
  46. at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
  47. at cn.itcast.datasource.c3p0.C3P0Demo2_1.main(C3P0Demo2_1.java:16)
  48. Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@7e0babb1 -- timeout at awaitAvailable()
  49. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1505)
  50. at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
  51. at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
  52. at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
  53. at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
  54. ... 2 more
  55. Process finished with exit code 1

Druid数据库连接池

数据库连接池实现技术,由阿里巴巴提供,全球最好!

配置环境

  1. 导入druid-1.0.9.jar
  2. 定义配置文件:
    • .properties 形式的
    • 可以叫任意名称,可以放在任意目录下
  3. 加载配置文件 Properties
  4. 获取数据库连接池对象
    • 通过工厂类来获取 :DruidDataSourceFactory
  5. 获取连接:getConnection

    druid.properties

    ```html driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql:///myfirsttest?serverTimezone=Asia/Shanghai username=root password=123456

    初始化连接数量

    initialSize=5

    最大连接数

    maxActive=10

    最大等待时间

    maxWait=3000

    maxIdle=8

    minIdle=3

validationQuery:SELECT 1 testWhileIdle:true testOnBorrow:false testOnReturn:false

  1. <a name="WVIci"></a>
  2. ### 测试
  3. ```java
  4. package cn.itcast.datasource.druid;
  5. import com.alibaba.druid.pool.DruidDataSourceFactory;
  6. import javax.sql.DataSource;
  7. import java.io.InputStream;
  8. import java.sql.Connection;
  9. import java.util.Properties;
  10. /**
  11. * Druid基本演示
  12. */
  13. public class DruidDemo {
  14. public static void main(String[] args) throws Exception {
  15. //1.导入jar包
  16. //2.定义配置文件
  17. //3.加载配置文件
  18. Properties pro = new Properties();
  19. InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
  20. pro.load(is);
  21. //4.获取连接池对象
  22. DataSource ds = DruidDataSourceFactory.createDataSource(pro);
  23. //5.获取连接
  24. Connection conn = ds.getConnection();
  25. System.out.println(conn);
  26. }
  27. }
  28. 结果:
  29. "C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=53834:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\druid-1.0.9.jar" cn.itcast.datasource.druid.DruidDemo
  30. 一月 21, 2021 9:45:40 下午 com.alibaba.druid.pool.DruidDataSource info
  31. 信息: {dataSource-1} inited
  32. com.mysql.cj.jdbc.ConnectionImpl@55a1c291
  33. Process finished with exit code 0

定义工具类

  1. 定义一个类JDBCUtils
  2. 提供静态代码块加载配置文件,初始化连接池对象
  3. 提供方法
    1. 获取连接方法:通过数据库连接池获取连接
    2. 释放资源
    3. 获取连接池的方法

image.pngimage.png

  1. package cn.itcast.utils;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import com.alibaba.druid.util.JdbcUtils;
  4. import javax.sql.DataSource;
  5. import java.io.IOException;
  6. import java.sql.Connection;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.util.Properties;
  11. public class JDBCUtils {
  12. //1.定义一个成员变量DataSource
  13. private static DataSource ds;
  14. static {
  15. try {
  16. //1.加载配置文件
  17. Properties pro = new Properties();
  18. pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  19. //2.获取DataSource
  20. ds = DruidDataSourceFactory.createDataSource(pro);
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. /**
  28. * 获取连接
  29. */
  30. public static Connection getConnection() throws SQLException {
  31. return ds.getConnection();
  32. }
  33. /**
  34. * 释放资源 方法的重载*2
  35. */
  36. public static void close(ResultSet rs ,Statement stmt, Connection conn){
  37. if (rs!=null){
  38. try {
  39. rs.close();
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. if (stmt!=null){
  45. try {
  46. stmt.close();
  47. } catch (SQLException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. if (conn!=null){
  52. try {
  53. conn.close();
  54. } catch (SQLException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }
  59. public static void close(Statement stmt,Connection conn){
  60. //简化代码
  61. close(null,stmt,conn);
  62. }
  63. /**
  64. * 获取连接池的方法
  65. */
  66. public static DataSource getDataSource(){
  67. return ds;
  68. }
  69. }

测试工具类

使用新的工具类
完成添加操作,给account表去添加一条记录

  1. package cn.itcast.datasource.druid;
  2. import cn.itcast.utils.JDBCUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. /**
  7. * 使用新的工具类
  8. * 完成添加操作,给account表去添加一条记录
  9. */
  10. public class DuridDemo2 {
  11. public static void main(String[] args) {
  12. Connection conn = null;
  13. PreparedStatement pstmt = null;
  14. try {
  15. //1.获取连接
  16. conn = JDBCUtils.getConnection();
  17. //2.定义sql
  18. String sql = "insert into account values(null,?,?)";
  19. //3.获取pstm对象
  20. pstmt = conn.prepareStatement(sql);
  21. //4.给?赋值
  22. pstmt.setString(1,"王五");
  23. pstmt.setDouble(2,3000);
  24. //5.执行sql
  25. int count = pstmt.executeUpdate();
  26. System.out.println(count);
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }finally {
  30. //6.释放资源
  31. JDBCUtils.close(pstmt,conn);
  32. }
  33. }
  34. }
  35. 结果:
  36. "C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=50885:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\DYQ\IdeaProjects\workplace\out\production\dateSource_jdbcTemplate;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\c3p0-0.9.5.5.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mchange-commons-java-0.2.19.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\mysql-connector-java-8.0.21.jar;C:\Users\DYQ\IdeaProjects\workplace\dataSource_jdbcTemplate\libs\druid-1.0.9.jar" cn.itcast.datasource.druid.DuridDemo2
  37. 一月 22, 2021 4:39:57 下午 com.alibaba.druid.pool.DruidDataSource info
  38. 信息: {dataSource-1} inited
  39. 1
  40. Process finished with exit code 0

返回“1”,说明成功改变一条数据
数据库成功添加
image.png