之前我们学习的时候,每一次,当我们需要向数据里获取信息的时候,我们都会先 向底层获取一个Connection对象 ,然后用这个对象向数据库里面申请资源,执行完sql语句之后又 关掉资源 。如此反复,这是相当费时的一件事情。
不如将其优化一下,先创建一个数据库连接池,里面放很多 连接对象 ,用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
概念
其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
好处
- 节约资源
-
实现
标准接口:DataSource
方法
获取连接 :getConnection()
归还连接 :如果连接对象Connection是从连接池中获取的,那么调用Connection.close() 方法,则不会再关闭连接了。而是归还连接
实现技术
我们一般不去实现它,有数据库厂商来实现
C3P0 :数据库连接池技术
Druid :数据库连接池实现技术,由阿里巴巴提供(全球最棒!
C3P0数据库连接技术
导入jar包 c3p0-0.9.5.5.jar mchange-commons-java-0.2.19.jar |
| 导入jar包 c3p0-0.9.5.5.jar mchange-commons-java-0.2.19.jar |
| —- | —- |
|
| 选中—> 右键—> Add Library |
- 定义配置文件
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可

<c3p0-config><!-- 使用默认的配置读取连接池对象 --><default-config><!-- 连接参数 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/myfirsttest?serverTimezone=Asia/Shanghai</property><property name="user">root</property><property name="password">123456</property><!-- 连接池参数 --><property name="initialPoolSize">5</property><property name="maxPoolSize">10</property><!-- <property name="checkoutTimeout">3000</property>--></default-config><named-config name="otherc3p0"><!-- 连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/myfirsttest</property><property name="user">root</property><property name="password">123456</property><!-- 连接池参数 --><property name="initialPoolSize">5</property><property name="maxPoolSize">8</property><!-- <property name="checkoutTimeout">1000</property>--></named-config></c3p0-config>
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接: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.创建数据库连接池对象DataSource ds = new ComboPooledDataSource();//2.获取连接对象Connection conn = ds.getConnection();//3.打印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
<a name="iSn7b"></a>## 基本验证<a name="jFwxr"></a>### 验证maxPoolSize(最大连接数<br />从c3p0-config.xml文件里可以看到最大连接数量是10个,咱们可以验证一下,for循环打印10个地址```javapackage 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 {//获取DataSourceDataSource ds = new ComboPooledDataSource();//2.获取连接for (int i = 1; i <=10 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);}}}结果:"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一月 21, 2021 12:19:59 下午 com.mchange.v2.log.MLog信息: MLog clients using java 1.4+ standard logging.一月 21, 2021 12:19:59 下午 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:19:59 下午 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 -> 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 ]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@2d209079 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6bdf28bb]7:com.mchange.v2.c3p0.impl.NewProxyConnection@2752f6e2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@e580929]8:com.mchange.v2.c3p0.impl.NewProxyConnection@7c75222b [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4c203ea1]9:com.mchange.v2.c3p0.impl.NewProxyConnection@1d251891 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@48140564]10:com.mchange.v2.c3p0.impl.NewProxyConnection@7c30a502 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@49e4cb85]Process finished with exit code 0
可以观察,是10个不同的地址
那么循环11次如何?
先是打印出10个地址,然后等待3秒开始报错
- 等待3秒是因为xml文件里面有一个超时配置,最多不超过3秒

所以说,如果多余10个人 同时 过来从池子里拿连接(10个连接都拿走的同时还在申请),就会造成如上报错情况。
当然,因为我们取完没有归还连接,所以到第11个人来取依旧会报错(池子里没有了,
此时就要考虑:
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 {
//获取DataSourceDataSource ds = new ComboPooledDataSource();//2.获取连接for (int i = 1; i <=11 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);if (i==5){conn.close(); //归还连接到连接池中}}
} }
结果:
“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
如上,从第五个人就开始归还连接了。所以第十一个可以从池子里拿到连接。地址相应也有重复的部分<a name="L0mwU"></a>### 配置多个condig<br />如图,和上这些块元素之后你就会发现,这里有两个config,一个默认default,一个命名named<br />展开来看,感觉内容大多也是相同的,只有个别不一样,那这些是干嘛用的?- 可以通过设置多个config,通过一个文件调用多个不同的数据源,操作不同的数据库- 如果你定义的字符串什么都不指定,什么都没传,则默认调用default-config。若指定name=""对应的值,则调用相应的named-config<br /><br />我这里循环打印10次,但最大申请量只有8个,运行后如果到第9个报错,那么说明调用的就是名为otherc3p0的config。<br />果不其然。爷成功了✌```javapackage 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_1 {public static void main(String[] args) throws SQLException {//1.获取DataSource,使用默认配置configDataSource ds = new ComboPooledDataSource("otherc3p0");//2.获取连接for (int i = 1; i <=10 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);}}}结果:"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一月 21, 2021 4:59:30 下午 com.mchange.v2.log.MLog信息: MLog clients using java 1.4+ standard logging.一月 21, 2021 4:59:31 下午 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 4:59:31 下午 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 -> 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 ]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.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@2d209079 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@6bdf28bb]7:com.mchange.v2.c3p0.impl.NewProxyConnection@2752f6e2 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@e580929]8:com.mchange.v2.c3p0.impl.NewProxyConnection@7c75222b [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4c203ea1]Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)at cn.itcast.datasource.c3p0.C3P0Demo2_1.main(C3P0Demo2_1.java:16)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()at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1505)at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)... 2 moreProcess finished with exit code 1
Druid数据库连接池
配置环境
- 导入druid-1.0.9.jar
- 定义配置文件:
- 是 .properties 形式的
- 可以叫任意名称,可以放在任意目录下
- 加载配置文件 Properties
- 获取数据库连接池对象
- 通过工厂类来获取 :DruidDataSourceFactory
- 获取连接: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=3000maxIdle=8
minIdle=3
validationQuery:SELECT 1 testWhileIdle:true testOnBorrow:false testOnReturn:false
<a name="WVIci"></a>### 测试```javapackage cn.itcast.datasource.druid;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.InputStream;import java.sql.Connection;import java.util.Properties;/*** Druid基本演示*/public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3.加载配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//4.获取连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//5.获取连接Connection conn = ds.getConnection();System.out.println(conn);}}结果:"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一月 21, 2021 9:45:40 下午 com.alibaba.druid.pool.DruidDataSource info信息: {dataSource-1} initedcom.mysql.cj.jdbc.ConnectionImpl@55a1c291Process finished with exit code 0
定义工具类
- 定义一个类JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法


package cn.itcast.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import com.alibaba.druid.util.JdbcUtils;import javax.sql.DataSource;import java.io.IOException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils {//1.定义一个成员变量DataSourceprivate static DataSource ds;static {try {//1.加载配置文件Properties pro = new Properties();pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));//2.获取DataSourceds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接*/public static Connection getConnection() throws SQLException {return ds.getConnection();}/*** 释放资源 方法的重载*2*/public static void close(ResultSet rs ,Statement stmt, Connection conn){if (rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt!=null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(Statement stmt,Connection conn){//简化代码close(null,stmt,conn);}/*** 获取连接池的方法*/public static DataSource getDataSource(){return ds;}}
测试工具类
使用新的工具类
完成添加操作,给account表去添加一条记录
package cn.itcast.datasource.druid;import cn.itcast.utils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;/*** 使用新的工具类* 完成添加操作,给account表去添加一条记录*/public class DuridDemo2 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;try {//1.获取连接conn = JDBCUtils.getConnection();//2.定义sqlString sql = "insert into account values(null,?,?)";//3.获取pstm对象pstmt = conn.prepareStatement(sql);//4.给?赋值pstmt.setString(1,"王五");pstmt.setDouble(2,3000);//5.执行sqlint count = pstmt.executeUpdate();System.out.println(count);} catch (SQLException e) {e.printStackTrace();}finally {//6.释放资源JDBCUtils.close(pstmt,conn);}}}结果:"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一月 22, 2021 4:39:57 下午 com.alibaba.druid.pool.DruidDataSource info信息: {dataSource-1} inited1Process finished with exit code 0
返回“1”,说明成功改变一条数据
数据库成功添加
