Commons Pool 连接 seekdb 示例程序
本文将介绍如何使用 Commons Pool、MySQL Connector/J 和 seekdb 构建一个应用程序,实现基本的数据库操作,包括 创建表、插入数据、更新数据、删除数据、查询数据和删除表等。
点击下载 commonpool-mysql-client 示例工程
前提条件
-
您已安装 seekdb。
-
您已安装 JDK 1.8 和 Maven。
-
您已安装 Eclipse。
信息本文档运行代码使用的工具是 Eclipse IDE for Java Developers 2022-03 版本,您也可以根据个人喜好选择适合自己的工具运行的示例代码。
操作步骤
本文中给出的操作步骤是在 Windows 环境下使用 Eclipse IDE for Java Developers 2022-03 编译和运行该项目的步骤。如果您使用的是其他操作系统环境或编译器,那么操作步骤可能会略有不同。
- 将
commonpool-mysql-client项目导入到 Eclipse 中。 - 获取 seekdb URL。
- 修改
commonpool-mysql-client项目中的数据库连接信息。 - 运行
commonpool-mysql-client项目。
步骤一:将 commonpool-mysql-client 项目导入到 Eclipse 中
-
打开 Eclipse,在菜单栏上选择 File -> Open Projects from File System。
-
在弹出的对话框中,点击 Directory 按钮选择项目所在的目录,然后点击 Finish 完成导入。
信息当使用 Eclipse 导入 Maven 项目时,Eclipse 会自动检测项目中的
pom.xml文件,并根据文件 中描述的依赖关系自动下载所需的依赖库,并将它们添加到项目中。
-
查看项目情况。

步骤二:获取 seekdb URL
-
联系 seekdb 部署人员或者管理员获取相应的数据库连接串。
示例如下:
mysql -hxxx.xxx.xxx.xxx -P2881 -uroot -p****** -Dtest更多连接串的信息,请参见 通过 MySQL 连接 seekdb。
-
根据 seekdb 连接串信息填写下面 URL 的对应信息。
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$password&useSSL=false参数说明:
$host:提供 seekdb 的连接 IP。使用实际的 IP 替换,也可以使用本地 IP 及 127.0.0.1。$port:提供 seekdb 接端口。使用实际的端口替换,默认是 2881,在部署 seekdb 时可自定义。$database_name:需要访问的数据库名称。user_name:提供连接账户。格式:用户名。password:提供账户密码。
更多有关 MySQL Connector/J 连接属性信息,请参见 Configuration Properties。
示例如下:
jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?user=root&password=******&useSSL=false
步骤三:修改 commonpool-mysql-client 项目中的数据库连接信息
根据 步骤二:获取 seekdb URL 中获取的信息修改文件 commonpool-mysql-client/src/main/resources/db.properties 中的数据库连接信息。

示例如下:
- seekdb 的 IP 地址为
xxx.xxx.xxx.xxx。 - 访问端口使用的是 2881。
- 需要访问的数据库名称为
test。 - 连接账户是
root。 - 密码是
******。
代码如下:
...
db.url=jdbc:mysql://xxx.xxx.xxx.xxx:2881/test?useSSL=false
db.username=root
db.password=******
...
步骤四:运行 commonpool-mysql-client 项目
-
在项目导航器视图中,找到并展开 src/main/java 目录。
-
右键点击 Main.java 文件,然后选择 Run As -> Java Application。

-
在 Eclipse 的控制台窗口中来查看输出结果。

项目代码介绍
点击 commonpool-mysql-client 下载项目代码,是一个名称为 commonpool-mysql-client.zip 的压缩包。
解压后,得到一个名为 commonpool-mysql-client 的文件夹。目录结构如下所示:
commonpool-mysql-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
文件说明:
src:源代码根目录。main:主代码目录,包含应用程序的主要逻辑。java:Java 源代码目录。com:Java 包目录。example:示例项目的包目录。Main.java:主类程序示例文件,包含创建表、插入、删除、更新和查询数据等逻辑。resources:资源文件目录,包含配置文件等。db.properties:连接池的配置文件,包含了数据库连接的相关参数。pom.xml:Maven 项目的配置文件,用于管理项目的依赖和构建设置。
pom.xml 代码介绍
pom.xml 文件是 Maven 项目的配置文件,定义了项目的依赖项、插件和构建规则等信息。Maven 是一个 Java 项目管理工具,可以自动下载依赖项、编译和打包项目等操作。
本文 pom.xml 文件的代码主要包括以下几个部分:
-
文件声明语句。
声明本文件是一个 XML 文件,使用的 XML 版本是
1.0,字符编码方式是UTF-8。代码如下:
<?xml version="1.0" encoding="UTF-8"?> -
配置 POM 的命名空间和 POM 模型版本。
- 通过
xmlns指定 POM 的命名空间为http://maven.apache.org/POM/4.0.0。 - 通过
xmlns:xsi指定 XML 命名空间http://www.w3.org/2001/XMLSchema-instance。 - 通过
xsi:schemaLocation指定 POM 的命名空间为http://maven.apache.org/POM/4.0.0和 POM 的 XSD 文件的位置为http://maven.apache.org/xsd/maven-4.0.0.xsd。 - 通过
<modelVersion>元素指定了该 POM 文件使用的 POM 模型版本为4.0.0。
代码如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 其他配置 -->
</project> - 通过
-
配置基本信息。
- 通过
<groupId>指定项目所属组织为com.example。 - 通过
<artifactId>指定项目的名称为commonpool-mysql-client。 - 通过
<version>项目的版本号为1.0-SNAPSHOT。
代码如下:
<groupId>com.example</groupId>
<artifactId>commonpool-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version> - 通过
-
配置项目源文件的属性。
指定 Maven 的编译器插件为
maven-compiler-plugin,并设置了源代码和目标 Java 版本都为 8。这意味着项目的源代码使用 Java 8 特性编写,且编译后的字节码也将兼容 Java 8 运行时环境。这样设置可以确保项目在编译和运行时能够正确地处理 Java 8 的语法和特性。信息Java 1.8 和 Java 8 是同一个版本的不同命名方式。
代码如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build> -
配置项目所依赖组件。
-
添加
mysql-connector-java依赖库,用于与数据库进行交互:- 通过
<groupId>指定依赖项所属的组织为mysql。 - 通过
<artifactId>指定依赖项的名称为mysql-connector-java。 - 通过
<version>指定依赖项的版本号为5.1.40。
代码如下:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency> - 通过
-
添加
commons-pool2依赖库,以便在项目中能够使用该库的功能和类:- 通过
<groupId>指定依赖项所属的组织为org.apache.commons。 - 通过
<artifactId>指定依赖项的名称为commons-pool2。 - 通过
<version>指定依赖项的版本号为2.7.0。
代码如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency> - 通过
-
db.properties 代码介绍
db.properties 是本文示例的连接池配置文件,其中包含了连接池的配置属性。这些属性包括数据库 URL、用户名、密码、连接池其他可选项。
本文 db.properties 文件的代码主要包括以下几个部分:
-
配置数据库连接参数。
- 配置数据库连接的 URL,包括主机 IP、端口号、需要访问的数据库。
- 配置数据库用户名。
- 配置数据库密码。
代码如下:
db.url=jdbc:mysql://$host:$port/$database_name?useSSL=false
db.username=$user_name
db.password=$password参数解释:
$host:提供 seekdb 的连接 IP。使用实际的 IP 替换,也可以使用本地 IP 及 127.0.0.1。$port:提供 seekdb 接端口。使用实际的端口替换,默认是 2881,在部署 seekdb 时可自定义。$database_name:需要访问的数据库名称。$user_name:提供连接账户。格式:用户名。$password:提供账户密码。
-
配置其他连接池的参数。
- 设置连接池的最大连接数为 10。这表示连接池中最多可以同时拥有 10 个连接。
- 设置连接池的最大空闲连接数为 5。当连接池中的连接数量超过最大空闲连接数时,多余的连接将被关闭。
- 设置连接池的最小空闲连接数为 2。即使连接池中没有正在使用的连接,也会保持至少 2 个空闲连接。
- 设置从连接池获取连接的最大等待时间为 5000 毫秒。如果连接池中没有可用连接,获取连接的操作将会等待,直到超过最大等待时间为止。
代码如下:
pool.maxTotal=10
pool.maxIdle=5
pool.minIdle=2
pool.maxWaitMillis=5000
具体的属性(参数)配置取决于项目需求和数据库的特点,建议您根据实际情况进行调整和配置。
Commons Pool 2 常用配置参数:
| 参数 | 描述 |
|---|---|
| url | 指定连接数据库的 URL 地址,包括数据库类型、主机名、端口号、数据库名称等信息。 |
| username | 连接数据库所需的用户名。 |
| password | 连接数据库所需的密码。 |
| maxTotal | 指定对象池中允许创建的最大对象数量。 |
| maxIdle | 指定对象池中允许保持的最大空闲对象数量。 |
| minIdle | 指定对象池中保持的最小空闲对象数量。 |
| blockWhenExhausted | 指定当对象池耗尽时,对 borrowObject 操作的行为。
|
| maxWaitMillis | 指定 borrowObject 方法在池耗尽时的最大等待时间(毫秒)。 |
| testOnBorrow | 指定在 borrowObject 方法调用时是否对对象进行验证。
|
| testOnReturn | 指定在 returnObject 方法调用时是否对对象进行验证。
|
| testWhileIdle | 指定当对象处于空闲状态时是否对它们进行验证,具体的含义如下:
|
| timeBetweenEvictionRunsMillis | 指定空闲对象的驱逐线程调度的时间间隔(毫秒)。 |
| numTestsPerEvictionRun | 指定每次驱逐线程调度时要检查的空闲对象数量。 |
Main.java 代码介绍
Main.java 文件是示例程序的一部分,代码演示了如何使用 Commons Pool 2 执行数据库操作。本文 Main.java 文件的代码主要包括以下几个部分:
-
定义包和导入必要的类。
- 声明当前代码所属的包名为
com.example。 - 导入
java.io.IOException类,用于处理输入输出异常。 - 导入
java.sql.Connection类,用于表示与数据库的连接。可以使用该对象执行 SQL 语句并获取结果。 - 导入
java.sql.DriverManager类,用于管理驱动程序的加载和数据库连接的建立。可以使用该类获取数据库连接。 - 导入
java.sql.ResultSet类,用于表示 SQL 查询的结果集。可以使用该对象遍历和操作查询结果。 - 导入
java.sql.SQLException类,用于处理 SQL 语句相关的异常情况。 - 导入
java.sql.Statement类,用于执行 SQL 语句的对象。可以通过Connection对象的createStatement方法创建。 - 导入
java.util.Properties类,是一个键值对的集合,用于加载和保存配置信息。可以从配置文件中加载数据库的连接信息。 - 导入
org.apache.commons.pool2.ObjectPool类,是一个对象池接口,定义了池化对象的基本操作,如获取、归还对象等。 - 导入
org.apache.commons.pool2.PoolUtils类,提供了一些工具方法,用于方便地操作对象池。 - 导入
org.apache.commons.pool2.PooledObject类,是一种实现了对象池管理的包装对象。可以通过实现该接口来管理池化对象的生命周期。 - 导入
org.apache.commons.pool2.impl.GenericObjectPool类,是ObjectPool接口的默认实现类,实现了连接池的基本功能。 - 导入
org.apache.commons.pool2.impl.GenericObjectPoolConfig类,是GenericObjectPool的配置类,用于设置连接池的属性。 - 导入
org.apache.commons.pool2.impl.DefaultPooledObject类,是PooledObject接口的默认实现类,用于管理池化对象的包装。它可以包含实际的连接对象以及其他一些管理信息。
代码如下:
package com.example;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.PoolUtils;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.commons.pool2.impl.DefaultPooledObject; - 声明当前代码所属的包名为
-
创建一个
Main类,并定义main方法。定义一个
Main类和main方法,main方法用于演示如何使用连接池从数据库中执行一系列的操作。具体步骤如下:-
定义一个名为
Main的公共类,作为程序的入口点。类名需要与文件名保持一致。 -
定义一个公共静态方法
main,作为程序的起始执行点。-
加载数据库配置文件:
- 创建一个
Properties对象,用于存储数据库配置信息。 - 通过 Main 类的类加载器获取
db.properties资源文件的输入流,并使用Properties对象的load()方法加载该输入流,将属性文件中的键值对加载到props对象中。 - 捕获可能抛出的
IOException异常,并打印异常堆栈信息。
- 创建一个
-
创建数据库连接池配置:
- 创建一个泛型对象池配置对象,用于配置连接池的行为。
- 设置连接池中允许的最大连接数。
- 设置连接池中允许的最大空闲连接数。
- 设置连接池中允许的最小空闲连接数。
- 设置获取连接的最大等待时间。
-
创建数据库连接池:创建一个线程安全的连接池对象
connectionPool,使用ConnectionFactory对象和poolConfig配置对象来创建泛型对象池,并将其包装在一个线程安全的对象池中。通过对连接池进行线程安全的包装,可以确保在多线程环境下的连接获取和释放操作的安全性。 -
获取数据库连接,使用连接池的
borrowObject()方法获取一个数据库 连接,并在try代码块中使用该连接进行数据库操作。- 调用
createTable()方法,创建表。 - 调用
insertData()方法,插入数据。 - 调用
selectData()方法,查询数据。 - 调用
updateData()方法,更新数据。 - 再次调用
selectData()方法,查询更新后的数据。 - 调用
deleteData()方法,删除数据。 - 再次调用
selectData()方法,查询删除后的数据。 - 调用
dropTable()方法,删除表。 - 捕获并打印任何异常。
- 调用
-
-
定义其他数据库操作方法。
代码如下:
public class Main {
public static void main(String[] args) {
// Load the database configuration file
Properties props = new Properties();
try {
props.load(Main.class.getClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
// Create the database connection pool configuration
GenericObjectPoolConfig<Connection> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(Integer.parseInt(props.getProperty("pool.maxTotal")));
poolConfig.setMaxIdle(Integer.parseInt(props.getProperty("pool.maxIdle")));
poolConfig.setMinIdle(Integer.parseInt(props.getProperty("pool.minIdle")));
poolConfig.setMaxWaitMillis(Long.parseLong(props.getProperty("pool.maxWaitMillis")));
// Create the database connection pool
ObjectPool<Connection> connectionPool = PoolUtils.synchronizedPool(new GenericObjectPool<>(new ConnectionFactory(
props.getProperty("db.url"), props.getProperty("db.username"), props.getProperty("db.password")), poolConfig));
// Get a database connection
try (Connection connection = connectionPool.borrowObject()) {
// Create table
createTable(connection);
// Insert data
insertData(connection);
// Query data
selectData(connection);
// Update data
updateData(connection);
// Query the updated data
selectData(connection);
// Delete data
deleteData(connection);
// Query the data after deletion
selectData(connection);
// Drop table
dropTable(connection);
} catch (Exception e) {
e.printStackTrace();
}
}
// 定义用于创建表的方法
// 定义用于插入数据的方法
// 定义用于更新数据的方法
// 定义用于删除数据的方法
// 定义用于查询数据的方法
// 定义用于删除表的方法
// 定义一个 ConnectionFactory 类
} -
-
定义用于创建表的方法。
定义一个名为
createTable的方法,接收一个Connection对象作为参数。具体步骤如下:- 定义一个私有静态方法
createTable(),接收一个Connection对象作为参数,并声明可能抛出SQLException异常。 - 使用连接的
createStatement()方法创建一个Statement对象,并在try-with-resources语句中使用该对象来执行数据库操作。 - 定义一个字符串变量
sql,存储创建表的 SQL 语句。 - 使用
Statement对象的executeUpdate()方法执行sql语句,创建表。 - 在控制台输出表创建成功的提示信息。
代码如下:
private static void createTable(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "CREATE TABLE test_commonpool (id INT,name VARCHAR(20))";
statement.executeUpdate(sql);
System.out.println("Table created successfully.");
}
} - 定义一个私有静态方法
-
定义用于插入数据的方法。
定义一个名为
insertData()的方法,接收一个Connection对象作为参数。具体步骤如下:- 定义一个私有静态方法
insertData(),接收一个Connection对象作为参数,并声明可能抛出SQLException异常。 - 使用连接的
createStatement()方法创建一个Statement对象,并在try-with-resources语句中使用该对象来执行数据库操作。 - 定义一个字符串变量
sql,存储插入数据的 SQL 语句。 - 使用
Statement对象的executeUpdate()方法执行sql语句,插入数据。 - 在控制台输出数据插入成功的提示信息。
代码如下:
private static void insertData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "INSERT INTO test_commonpool (id, name) VALUES (1,'A1'), (2,'A2'), (3,'A3')";
statement.executeUpdate(sql);
System.out.println("Data inserted successfully.");
}
} - 定义一个私有静态方法
-
定义用于更新数据的方法。
定义一个名为
updateData()的方法,接收一个Connection对象作为参数。具体步骤如下:- 定义一个私有静态方法
updateData(),接收一个Connection对象作为参数,并声明可能抛出SQLException异常。 - 使用连接的
createStatement()方法创建一个Statement对象,并在try-with-resources语句中使用该对象来执行数据库操作。 - 定义一个字符串变量
sql,存储更新数据的 SQL 语句。 - 使用
Statement对象的executeUpdate()方法执行sql语句,更新数据。 - 在控制台输出数据更新成功的提示信息。
代码如下:
private static void updateData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "UPDATE test_commonpool SET name = 'A11' WHERE id = 1";
statement.executeUpdate(sql);
System.out.println("Data updated successfully.");
}
} - 定义一个私有静态方法
-
定义用于删除数据的方法。
定义一个名为
deleteData()的方法,接收一个Connection对象作为参数。具体步骤如下:- 定义一个私有静态方法
deleteData()
- 定义一个私有静态方法