SpringBoot整合c3p0、Druid数据库连接池

2020-11-24 14:48:10 浏览数 (1)

1、C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,同时在Hibernate、Spring项目开发中被广泛应用。修改项目的pom.xml配置文件,添加C3P0依赖支持管理,由于要连接mysql,所以也要加入mysql的依赖包,如下所示:

代码语言:javascript复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5     https://maven.apache.org/xsd/maven-4.0.0.xsd">
 6 
 7     <modelVersion>4.0.0</modelVersion>
 8     <parent>
 9         <!-- spring-boot-starter-parent就是官方给出的快速构建SpringBoot项目的公共父pom.xml配置文件支持。 -->
10         <groupId>org.springframework.boot</groupId>
11         <artifactId>spring-boot-starter-parent</artifactId>
12         <version>2.3.4.RELEASE</version>
13         <relativePath /> <!-- lookup parent from repository -->
14     </parent>
15 
16     <groupId>com.bie</groupId>
17     <artifactId>springboot-01</artifactId>
18     <version>0.0.1-SNAPSHOT</version>
19     <name>springboot-01</name>
20     <description>Demo project for Spring Boot</description>
21 
22     <properties>
23         <java.version>1.8</java.version>
24         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
25     </properties>
26 
27     <dependencies>
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-web</artifactId>
31         </dependency>
32 
33         <dependency>
34             <groupId>org.springframework.boot</groupId>
35             <artifactId>spring-boot-starter-test</artifactId>
36             <scope>test</scope>
37             <exclusions>
38                 <exclusion>
39                     <groupId>org.junit.vintage</groupId>
40                     <artifactId>junit-vintage-engine</artifactId>
41                 </exclusion>
42             </exclusions>
43         </dependency>
44         <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
45         <dependency>
46             <groupId>com.mchange</groupId>
47             <artifactId>c3p0</artifactId>
48             <version>0.9.5.2</version>
49         </dependency>
50         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
51         <dependency>
52             <groupId>mysql</groupId>
53             <artifactId>mysql-connector-java</artifactId>
54             <!-- <version>5.1.12</version> -->
55         </dependency>
56         <dependency>
57             <groupId>org.springframework.boot</groupId>
58             <artifactId>spring-boot-configuration-processor</artifactId>
59             <optional>true</optional>
60         </dependency>
61     </dependencies>
62 
63     <build>
64         <plugins>
65             <plugin>
66                 <groupId>org.springframework.boot</groupId>
67                 <artifactId>spring-boot-maven-plugin</artifactId>
68             </plugin>
69         </plugins>
70     </build>
71 
72 </project>

然后,更新项目,Maven -> Update Project,修改application.yml配置文件,追加C3P0数据库连接池配置信息。

代码语言:javascript复制
 1 # 定义c3p0的配置,没有提示可以使用,数据库连接地址
 2 c3p0.jdbcUrl=jdbc:mysql://localhost:3306/biehl?serverTimezone=UTC
 3 # 数据库用户名
 4 c3p0.user=root
 5 # 数据库密码
 6 c3p0.password=123456
 7 # 数据库驱动程序
 8 c3p0.driverClass=com.mysql.jdbc.Driver
 9 # 最小连接数
10 c3p0.minPoolSize=2
11 # 最大连接数
12 c3p0.maxPoolSize=10
13 # 最大等待时间
14 c3p0.maxIdleTime=3000
15 # 初始化连接数
16 c3p0.initialPoolSize=3

定义c3p0的配置的时候,没有提示可以使用,数据库连接地址后面要加上?serverTimezone=UTC,不然报下面的错误,如下所示:

高版本的 spring boot搭配mysql 驱动版本较高时,如 mysql-connector-java:8.0.16,此时 driver-class-name 的值要带 cj(可不带),url 的值要带时区 serverTimezone(要带)。

代码语言:javascript复制
  1   .   ____          _            __ _ _
  2  /\ / ___'_ __ _ _(_)_ __  __ _    
  3 ( ( )___ | '_ | '_| | '_ / _` |    
  4  \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  5   '  |____| .__|_| |_|_| |___, | / / / /
  6  =========|_|==============|___/=/_/_/_/
  7  :: Spring Boot ::        (v2.3.4.RELEASE)
  8 
  9 2020-11-15 11:17:01.181  INFO 4908 --- [           main] com.bie.Springboot01ApplicationTests     : Starting Springboot01ApplicationTests on DESKTOP-V37QSSE with PID 4908 (started by biehl in E:eclipseeclipseworkspace_springbootspringboot-01)
 10 2020-11-15 11:17:01.182  INFO 4908 --- [           main] com.bie.Springboot01ApplicationTests     : No active profile set, falling back to default profiles: default
 11 2020-11-15 11:17:01.885  INFO 4908 --- [g-Init-Reporter] com.mchange.v2.log.MLog                  : MLog clients using slf4j logging.
 12 2020-11-15 11:17:02.796  INFO 4908 --- [           main] com.mchange.v2.c3p0.C3P0Registry         : Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10]
 13 2020-11-15 11:17:03.307  INFO 4908 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
 14 2020-11-15 11:17:03.652  INFO 4908 --- [           main] com.bie.Springboot01ApplicationTests     : Started Springboot01ApplicationTests in 2.803 seconds (JVM running for 4.051)
 15 2020-11-15 11:17:03.950  INFO 4908 --- [           main] c.m.v.c.i.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 -> 1hgemn5ad1k0s6dw1kn7og9|3be8821f, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hgemn5ad1k0s6dw1kn7og9|3be8821f, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/biehl, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 1800000, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 2, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
 16 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.
 17 2020-11-15 11:17:34.489  WARN 4908 --- [HelperThread-#2] c.m.v2.resourcepool.BasicResourcePool    : com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@2c34448d -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
 18 
 19 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 20     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 21     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 22     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 23     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 24     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 25     at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 26     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 27     at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 28     at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 29     at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 30     at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 31     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 32     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 33     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 34     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 35     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 36     at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 37     at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 38     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) [mchange-commons-java-0.2.11.jar:0.2.11]
 39 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 40     at sun.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source) ~[na:na]
 41     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_191]
 42     at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_191]
 43     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 44     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 45     at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 46     at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 47     at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 48     at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 49     at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 50     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 51     ... 12 common frames omitted
 52 
 53 2020-11-15 11:17:34.492  WARN 4908 --- [HelperThread-#2] c.m.v2.resourcepool.BasicResourcePool    : Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@51a8313b is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.
 54 2020-11-15 11:17:34.495  WARN 4908 --- [HelperThread-#0] c.m.v2.resourcepool.BasicResourcePool    : com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@bf450d2 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
 55 
 56 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 57     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 58     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 59     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 60     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 61     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 62     at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 63     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 64     at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 65     at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 66     at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 67     at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 68     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 69     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 70     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 71     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 72     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 73     at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 74     at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) ~[c3p0-0.9.5.2.jar:0.9.5.2]
 75     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) [mchange-commons-java-0.2.11.jar:0.2.11]
 76 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 77     at sun.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source) ~[na:na]
 78     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_191]
 79     at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_191]
 80     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 81     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 82     at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 83     at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 84     at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 85     at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 86     at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 87     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 88     ... 12 common frames omitted
 89 
 90 2020-11-15 11:17:34.495  WARN 4908 --- [HelperThread-#0] c.m.v2.resourcepool.BasicResourcePool    : Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@51a8313b is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.
 91 2020-11-15 11:17:34.495  WARN 4908 --- [HelperThread-#1] c.m.v2.resourcepool.BasicResourcePool    : com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6ed18a76 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
 92 
 93 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
 94     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 95     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 96     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 97     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 98     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.21.jar:8.0.21]
 99     at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.21.jar:8.0.21]
100     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.21.jar:8.0.21]
101     at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.21.jar:8.0.21]
102     at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.21.jar:8.0.21]
103     at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.21.jar:8.0.21]
104     at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) ~[c3p0-0.9.5.2.jar:0.9.5.2]
105     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) ~[c3p0-0.9.5.2.jar:0.9.5.2]
106     at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) ~[c3p0-0.9.5.2.jar:0.9.5.2]
107     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) ~[c3p0-0.9.5.2.jar:0.9.5.2]
108     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) ~[c3p0-0.9.5.2.jar:0.9.5.2]
109     at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) ~[c3p0-0.9.5.2.jar:0.9.5.2]
110     at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) ~[c3p0-0.9.5.2.jar:0.9.5.2]
111     at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) ~[c3p0-0.9.5.2.jar:0.9.5.2]
112     at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) [mchange-commons-java-0.2.11.jar:0.2.11]
113 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
114     at sun.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source) ~[na:na]
115     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_191]
116     at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_191]
117     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.21.jar:8.0.21]
118     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.21.jar:8.0.21]
119     at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.21.jar:8.0.21]
120     at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120) ~[mysql-connector-java-8.0.21.jar:8.0.21]
121     at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143) ~[mysql-connector-java-8.0.21.jar:8.0.21]
122     at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.21.jar:8.0.21]
123     at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967) ~[mysql-connector-java-8.0.21.jar:8.0.21]
124     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ~[mysql-connector-java-8.0.21.jar:8.0.21]
125     ... 12 common frames omitted
126 
127 2020-11-15 11:17:34.496  WARN 4908 --- [HelperThread-#1] c.m.v2.resourcepool.BasicResourcePool    : Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@51a8313b is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.
128 2020-11-15 11:17:34.519  INFO 4908 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

建立C3P0数据源连接池配置类,此时设置的Bean名称为dataSource。

代码语言:javascript复制
 1 package com.bie.config;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.springframework.boot.context.properties.ConfigurationProperties;
 6 import org.springframework.boot.jdbc.DataSourceBuilder;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 
10 @Configuration
11 public class C3p0DatasourceConfig {
12 
13     // c3p0 连接池
14     @Bean(name = "dataSource")
15     @ConfigurationProperties(prefix = "c3p0")
16     public DataSource dataSource() {
17         return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build();
18     }
19 
20 }

编写Junit测试类,测试当前DataSource配置是否正确。

代码语言:javascript复制
  1 package com.bie;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 
  8 import javax.sql.DataSource;
  9 
 10 import org.junit.jupiter.api.Test;
 11 import org.junit.runner.RunWith;
 12 import org.springframework.beans.factory.annotation.Autowired;
 13 import org.springframework.boot.test.context.SpringBootTest;
 14 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 15 import org.springframework.test.context.web.WebAppConfiguration;
 16 
 17 @SpringBootTest(classes = Springboot01Application.class) // 定义要测试的Springboot类
 18 @RunWith(SpringJUnit4ClassRunner.class) // 使用Junit进行测试
 19 @WebAppConfiguration // 进行Web应用配置
 20 class Springboot01ApplicationTests {
 21 
 22     @Autowired
 23     private DataSource dataSource; // 注入DataSource对象
 24 
 25     @Test
 26     void testConnection() throws SQLException {
 27         // 获取连接
 28         Connection connection = this.dataSource.getConnection();
 29         System.out.println(connection);
 30 
 31         String sql = "select * from user_info  ";
 32         PreparedStatement ps = connection.prepareStatement(sql);
 33         ResultSet rs = ps.executeQuery();
 34         UserInfo users = null;
 35         if (rs.next()) {
 36             users = new UserInfo();
 37             // 从数据库中获取值设置到实体类的setter方法中
 38             users.setUserId(rs.getInt("user_id"));
 39             users.setUserAccount(rs.getString("user_account"));
 40             users.setUserPw(rs.getString("user_pw"));
 41             users.setUserNumber(rs.getString("user_number"));
 42             users.setUserName(rs.getString("user_name"));
 43             users.setUserAge(rs.getInt("user_age"));
 44             users.setUserSex(rs.getString("user_sex"));
 45             users.setUserMark(rs.getString("user_mark"));
 46             users.setIsMoney(rs.getString("is_money"));
 47             System.out.println(users.toString());
 48         }
 49     }
 50 
 51     // 内部类
 52     class UserInfo {
 53         private Integer userId;// 用户编号
 54         private String userAccount;// 用户账号
 55         private String userPw;// 用户密码
 56         private String userNumber;// 用户学号
 57         private String userName;// 用户姓名
 58         private Integer userAge;// 用户年龄
 59         private String userSex;// 用户性别
 60         private String userMark;// 用户标识,可以使用一张表,完成管理员和用户
 61 
 62         private String isMoney;
 63 
 64         public Integer getUserId() {
 65             return userId;
 66         }
 67 
 68         public void setUserId(Integer userId) {
 69             this.userId = userId;
 70         }
 71 
 72         public String getUserAccount() {
 73             return userAccount;
 74         }
 75 
 76         public void setUserAccount(String userAccount) {
 77             this.userAccount = userAccount;
 78         }
 79 
 80         public String getUserPw() {
 81             return userPw;
 82         }
 83 
 84         public void setUserPw(String userPw) {
 85             this.userPw = userPw;
 86         }
 87 
 88         public String getUserNumber() {
 89             return userNumber;
 90         }
 91 
 92         public void setUserNumber(String userNumber) {
 93             this.userNumber = userNumber;
 94         }
 95 
 96         public String getUserName() {
 97             return userName;
 98         }
 99 
100         public void setUserName(String userName) {
101             this.userName = userName;
102         }
103 
104         public Integer getUserAge() {
105             return userAge;
106         }
107 
108         public void setUserAge(Integer userAge) {
109             this.userAge = userAge;
110         }
111 
112         public String getUserSex() {
113             return userSex;
114         }
115 
116         public void setUserSex(String userSex) {
117             this.userSex = userSex;
118         }
119 
120         public String getUserMark() {
121             return userMark;
122         }
123 
124         public void setUserMark(String userMark) {
125             this.userMark = userMark;
126         }
127 
128         public String getIsMoney() {
129             return isMoney;
130         }
131 
132         public void setIsMoney(String isMoney) {
133             this.isMoney = isMoney;
134         }
135 
136         @Override
137         public String toString() {
138             return "UserInfo [userId="   userId   ", userAccount="   userAccount   ", userPw="   userPw
139                       ", userNumber="   userNumber   ", userName="   userName   ", userAge="   userAge   ", userSex="
140                       userSex   ", userMark="   userMark   ", isMoney="   isMoney   "]";
141         }
142 
143     }
144 
145 }

使用该测试类的时候,如果报下面的错误,在包资源管理器中右键单击您的项目,然后build path,然后configure build path,然后libraries-->add libraries-->junit-->添加就好了。

代码语言:javascript复制
 1 java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
 2     at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.<init>(JUnit5TestLoader.java:31)
 3     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 4     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
 5     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
 6     at java.lang.reflect.Constructor.newInstance(Unknown Source)
 7     at java.lang.Class.newInstance(Unknown Source)
 8     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.java:367)
 9     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.java:362)
10     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:306)
11     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:221)
12     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:205)
13 Caused by: java.lang.ClassNotFoundException: org.junit.platform.launcher.core.LauncherFactory
14     at java.net.URLClassLoader.findClass(Unknown Source)
15     at java.lang.ClassLoader.loadClass(Unknown Source)
16     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
17     at java.lang.ClassLoader.loadClass(Unknown Source)
18     ... 11 more

2、SpringBoot整合Druid数据库连接池,Druid是阿里巴巴推出的一款数据库连接池组件(可以理解为C3P0的下一代产品),也是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,可高效处理大规模的数据并实现快速查询和分析。

修改项目的pom.xml文件,引入Druid的相关依赖库,如下所示:

代码语言:javascript复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5     https://maven.apache.org/xsd/maven-4.0.0.xsd">
 6 
 7     <modelVersion>4.0.0</modelVersion>
 8     <parent>
 9         <!-- spring-boot-starter-parent就是官方给出的快速构建SpringBoot项目的公共父pom.xml配置文件支持。 -->
10         <groupId>org.springframework.boot</groupId>
11         <artifactId>spring-boot-starter-parent</artifactId>
12         <version>2.3.4.RELEASE</version>
13         <relativePath /> <!-- lookup parent from repository -->
14     </parent>
15 
16     <groupId>com.bie</groupId>
17     <artifactId>springboot-01</artifactId>
18     <version>0.0.1-SNAPSHOT</version>
19     <name>springboot-01</name>
20     <description>Demo project for Spring Boot</description>
21 
22     <properties>
23         <java.version>1.8</java.version>
24         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
25     </properties>
26 
27     <dependencies>
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-web</artifactId>
31         </dependency>
32 
33         <dependency>
34             <groupId>org.springframework.boot</groupId>
35             <artifactId>spring-boot-starter-test</artifactId>
36             <scope>test</scope>
37             <exclusions>
38                 <exclusion>
39                     <groupId>org.junit.vintage</groupId>
40                     <artifactId>junit-vintage-engine</artifactId>
41                 </exclusion>
42             </exclusions>
43         </dependency>
44         <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
45         <dependency>
46             <groupId>com.mchange</groupId>
47             <artifactId>c3p0</artifactId>
48             <version>0.9.5.2</version>
49         </dependency>
50         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
51         <dependency>
52             <groupId>mysql</groupId>
53             <artifactId>mysql-connector-java</artifactId>
54             <!-- <version>5.1.12</version> -->
55         </dependency>
56         <dependency>
57             <groupId>org.springframework.boot</groupId>
58             <artifactId>spring-boot-configuration-processor</artifactId>
59             <optional>true</optional>
60         </dependency>
61 
62         <!-- 引入 Druid 数据源依赖:https://mvnrepository.com/artifact/com.alibaba/druid -->
63         <dependency>
64             <groupId>com.alibaba</groupId>
65             <artifactId>druid</artifactId>
66             <version>1.1.9</version>
67         </dependency>
68     </dependencies>
69 
70     <build>
71         <plugins>
72             <plugin>
73                 <groupId>org.springframework.boot</groupId>
74                 <artifactId>spring-boot-maven-plugin</artifactId>
75             </plugin>
76         </plugins>
77     </build>
78 
79 </project>

修改application.yml配置文件,追加Druid的连接配置,如下所示:

代码语言:javascript复制
 1 # 配置当前要使用的数据源的操作类型
 2 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 3 # 配置Mysql的驱动程序类
 4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 5 # 数据库连接地址
 6 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/biehl
 7 # 数据库用户名称
 8 spring.datasource.username=root
 9 # 数据库密码
10 spring.datasource.password=123456
11 # 进行数据库链接池的配置,数据库最小维持连接数
12 spring.datasource.dbcp2.min-idle=1
13 # 数据库初始化提供的连接数
14 spring.datasource.dbcp2.initial-size=1
15 # 数据库最大维持连接数
16 spring.datasource.dbcp2.max-total=1
17 # 等待连接获取的最大超时时间
18 spring.datasource.dbcp2.max-wait-millis=3000

建立Druid数据源连接池配置类,此时设置的Bean名称为dataSource。也可以使用@Value手动一个一个将参数注入进来,然后设置,不过使用@ConfigurationProperties 绑定配置文件参数,此注解更加方便。

代码语言:javascript复制
 1 package com.bie.config;
 2 
 3 import javax.sql.DataSource;
 4 
 5 import org.springframework.boot.context.properties.ConfigurationProperties;
 6 import org.springframework.context.annotation.Bean;
 7 import org.springframework.context.annotation.Configuration;
 8 
 9 import com.alibaba.druid.pool.DruidDataSource;
10 
11 @Configuration
12 public class DruidDataSourceConfiguration {
13 
14     /**
15      * 注入bean
16      * 
17      * @return
18      */
19     @Bean(name = "dataSource")
20     // 作用就是将全局配置文件中 前缀为 spring.datasource的属性值注入到
21     // com.alibaba.druid.pool.DruidDataSource 的同名参数中。
22     @ConfigurationProperties(prefix = "spring.datasource")
23     public DataSource dataSource() {
24         DruidDataSource datasource = new DruidDataSource();
25         return datasource;
26     }
27 
28 }

编写Junit测试类,测试当前DataSource配置是否正确。

代码语言:javascript复制
  1 package com.bie;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 
  8 import javax.sql.DataSource;
  9 
 10 import org.junit.jupiter.api.Test;
 11 import org.junit.runner.RunWith;
 12 import org.springframework.beans.factory.annotation.Autowired;
 13 import org.springframework.boot.test.context.SpringBootTest;
 14 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 15 import org.springframework.test.context.web.WebAppConfiguration;
 16 
 17 @SpringBootTest(classes = Springboot01Application.class) // 定义要测试的Springboot类
 18 @RunWith(SpringJUnit4ClassRunner.class) // 使用Junit进行测试
 19 @WebAppConfiguration // 进行Web应用配置
 20 class Springboot01ApplicationTests {
 21 
 22     @Autowired
 23     private DataSource dataSource; // 注入DataSource对象
 24 
 25     @Test
 26     void testConnection() throws SQLException {
 27         // 获取连接
 28         Connection connection = this.dataSource.getConnection();
 29         System.out.println(connection);
 30 
 31         String sql = "select * from user_info  ";
 32         PreparedStatement ps = connection.prepareStatement(sql);
 33         ResultSet rs = ps.executeQuery();
 34         UserInfo users = null;
 35         if (rs.next()) {
 36             users = new UserInfo();
 37             // 从数据库中获取值设置到实体类的setter方法中
 38             users.setUserId(rs.getInt("user_id"));
 39             users.setUserAccount(rs.getString("user_account"));
 40             users.setUserPw(rs.getString("user_pw"));
 41             users.setUserNumber(rs.getString("user_number"));
 42             users.setUserName(rs.getString("user_name"));
 43             users.setUserAge(rs.getInt("user_age"));
 44             users.setUserSex(rs.getString("user_sex"));
 45             users.setUserMark(rs.getString("user_mark"));
 46             users.setIsMoney(rs.getString("is_money"));
 47             System.out.println(users.toString());
 48         }
 49     }
 50 
 51     // 内部类
 52     class UserInfo {
 53         private Integer userId;// 用户编号
 54         private String userAccount;// 用户账号
 55         private String userPw;// 用户密码
 56         private String userNumber;// 用户学号
 57         private String userName;// 用户姓名
 58         private Integer userAge;// 用户年龄
 59         private String userSex;// 用户性别
 60         private String userMark;// 用户标识,可以使用一张表,完成管理员和用户
 61 
 62         private String isMoney;
 63 
 64         public Integer getUserId() {
 65             return userId;
 66         }
 67 
 68         public void setUserId(Integer userId) {
 69             this.userId = userId;
 70         }
 71 
 72         public String getUserAccount() {
 73             return userAccount;
 74         }
 75 
 76         public void setUserAccount(String userAccount) {
 77             this.userAccount = userAccount;
 78         }
 79 
 80         public String getUserPw() {
 81             return userPw;
 82         }
 83 
 84         public void setUserPw(String userPw) {
 85             this.userPw = userPw;
 86         }
 87 
 88         public String getUserNumber() {
 89             return userNumber;
 90         }
 91 
 92         public void setUserNumber(String userNumber) {
 93             this.userNumber = userNumber;
 94         }
 95 
 96         public String getUserName() {
 97             return userName;
 98         }
 99 
100         public void setUserName(String userName) {
101             this.userName = userName;
102         }
103 
104         public Integer getUserAge() {
105             return userAge;
106         }
107 
108         public void setUserAge(Integer userAge) {
109             this.userAge = userAge;
110         }
111 
112         public String getUserSex() {
113             return userSex;
114         }
115 
116         public void setUserSex(String userSex) {
117             this.userSex = userSex;
118         }
119 
120         public String getUserMark() {
121             return userMark;
122         }
123 
124         public void setUserMark(String userMark) {
125             this.userMark = userMark;
126         }
127 
128         public String getIsMoney() {
129             return isMoney;
130         }
131 
132         public void setIsMoney(String isMoney) {
133             this.isMoney = isMoney;
134         }
135 
136         @Override
137         public String toString() {
138             return "UserInfo [userId="   userId   ", userAccount="   userAccount   ", userPw="   userPw
139                       ", userNumber="   userNumber   ", userName="   userName   ", userAge="   userAge   ", userSex="
140                       userSex   ", userMark="   userMark   ", isMoney="   isMoney   "]";
141         }
142 
143     }
144 
145 }

如果进行连接测试使用的ORM框架的话,需要导入相应ORM框架的依赖支持包。

0 人点赞