介绍
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。即如果有大量用户访问数据库,连接池便可以为每个用户提供连接,用户访问完之后收回连接以备再次使用。
连接池可以极大的改善用户的 Java 应用程序的性能,同时减少全部资源的使用。 ## c3p0连接池下载地址 在这里我选择用c3p0作为连接池。c3p0可以以下链接进行下载:c3p0下载
初始化连接池
1 | package hellomysql; |
通过这个类,我们就可以创建一个连接池,并从中得到一个连接:
1
2
3
4
5
6
7
8
9
10
11
12
13package hellomysql;
public class Main {
public static void main(String[] args) {
try {
DataSource dataSource = new DataSource("root","root");
dataSource.setURL("jdbc:mysql://localhost:3306/hello_mysql");
Connection connection = dataSource.getConnection();
} catch (Exception event) {
event.printStackTrace();
}
}
}
为解决此问题,我们要在URL内设置时区为标准世界时间,同时,最好将编码格式设为utf-8以便于中文读取。
我们把链接改为如下样式便可以解决问题: 1
connector.setURL("jdbc:mysql://localhost:3306/hello_mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
指定数据表
在实现DataSource类后,我们再创建一个Connector类,这样就可以在Connector类中指定对应的数据表并获取表头。
1 | package hellomysql; |
这样,我们就可以创建一个Connector类,并为其指定用户名、密码、URL、数据表名:
1 | package hellomysql; |
获取连接
接下来,我们就可以从Connector中返回连接分配给指定用户,用户就可以对数据表进行浏览和增删改查操作,我们再创建一个ConnectionUser用户类:
1 | package hellomysql; |
这样,我们就可以创建很多用户并对数据库进行访问了: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package hellomysql;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
try {
Connector connector = new Connector("root", "123");
connector.setURL("jdbc:mysql://localhost:3306/hello_mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
connector.setTable("people");
//创建一个ArrayList类来存储用户
ArrayList<ConnectionUser> users = new ArrayList<>();
//创建10个用户
for (int i = 0; i < 10; ++i) {
users.add(new ConnectionUser(connector));
}
//每个用户都进行查询,以模拟10个用户同时访问数据库的情形
for (ConnectionUser each : users) {
each.viewData();
}
//关闭每个用户的连接,之所以不在上一个循环体内关闭,
//是为了模拟多个用户的同时访问,以测试c3p0连接池的使用效果
for (ConnectionUser each : users) {
each.stopConnection();
}
} catch (Exception event) {
event.printStackTrace();
}
}
}
运行效果
效果如下: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41D:\software\system\IdeaIU-2019.3.3\jdk\jdk-14\bin\java.exe -javaagent:D:\software\system\IdeaIU-2019.3.3\lib\idea_rt.jar=53693:D:\software\system\IdeaIU-2019.3.3\bin -Dfile.encoding=UTF-8 -classpath D:\programme\java\out\production\java;D:\software\system\mysql-8.0.19-winx64\lib\mysql-connector-java-8.0.19.jar;D:\software\system\mysql-8.0.19-winx64\lib\c3p0-0.9.5.5.jar;D:\software\system\mysql-8.0.19-winx64\lib\mchange-commons-java-0.2.19.jar hellomysql.Main
4月 21, 2020 3:01:25 下午 com.mchange.v2.log.MLog
信息: MLog clients using java 1.4+ standard logging.
4月 21, 2020 3:01:26 下午 com.mchange.v2.c3p0.C3P0Registry
信息: Initializing c3p0-0.9.5.5 [built 11-December-2019 22:07:46 -0800; debug? true; trace: 10]
Welcome root!
Table set success! The table is: people.
4月 21, 2020 3:01:26 下午 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 -> 1hgeby9a9175nsjevsaq70|129a8472, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.cj.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 1hgeby9a9175nsjevsaq70|129a8472, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://localhost:3306/hello_mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 50, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {password=******, user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
----------------------------
[id, name, age]
1, Adam, 13
2, Amy, 18
3, Cathy, 15
4, Henry, 21
5, Hans, 17
----------------------------
View success!
----------------------------
[id, name, age]
1, Adam, 13
2, Amy, 18
3, Cathy, 15
4, Henry, 21
5, Hans, 17
----------------------------
View success!
//......实际操作中会生成10次查表信息,此处省略以节省篇幅
----------------------------
[id, name, age]
1, Adam, 13
2, Amy, 18
3, Cathy, 15
4, Henry, 21
5, Hans, 17
----------------------------
View success!
Process finished with exit code 0
经测试,本文中的连接池大概支持20个用户的同时访问,在实际使用中,我们可以修改连接池设置以实现数量更大的用户访问。
此例中用户只实现了查询操作,当然增删改查的函数也可以写到ConnectionUser用户类中,我们还可以建立不同的用户类,分为管理员用户、普通用户等,不同用户中提供不同的操作函数,如管理员可以进行增删改查,普通用户可以查看和添加,游客用户只可以查看等,此处不再实现,因为并不是本文重点。
这就是本文的全部内容