Sample program for connecting to an OceanBase database using Commons Pool
This topic describes how to use Commons Pool, MySQL Connector/J, and an OceanBase database to build an application. The application performs basic database operations, including creating tables, inserting data, updating data, deleting data, querying data, and dropping tables.
Click to download the commonpool-mysql-client sample project
Prerequisites
You have installed an OceanBase database and created a tenant in MySQL mode.
You have installed JDK 1.8 and Maven.
You have installed Eclipse.
NoteThis topic uses Eclipse IDE for Java Developers 2022-03 to run the code. You can also use other tools to run the sample code.
Procedure
The steps in this topic describe how to compile and run the project in a Windows environment using Eclipse IDE for Java Developers 2022-03. The steps may differ if you use a different operating system or compiler.
Import the
commonpool-mysql-clientproject into Eclipse.Obtain the OceanBase database URL.
Modify the database connection information in the
commonpool-mysql-clientproject.Run the
commonpool-mysql-clientproject.
Step 1: Import the commonpool-mysql-client project into Eclipse
Open Eclipse. From the menu bar, select File > Open Projects from File System.
In the dialog box that appears, click the Directory button to select the project directory. Then, click Finish to complete the import.
NoteWhen you import a Maven project into Eclipse, Eclipse automatically detects the
pom.xmlfile. It then downloads the required dependency libraries based on the dependencies described in the file and adds them to the project.
View the project status.

Step 2: Get the OceanBase database URL
Contact the OceanBase database deployment personnel or administrator to obtain the database connection string.
Example:
obclient -hxxx.xxx.xxx.xxx -P3306 -utest_user001 -p****** -DtestFor more information about connection strings, see Obtain connection parameters.
Complete the following URL with the information from your OceanBase database connection string.
jdbc:mysql://$host:$port/$database_name?user=$user_name&password=$password&useSSL=falseParameters:
$host: The domain name for the OceanBase database connection.$port: The connection port for the OceanBase database. The default port for a MySQL mode tenant is 3306.$database_name: The name of the database to access.$user_name: The connection account for the tenant.$password: The password for the account.
For more information about MySQL Connector/J connection properties, see Configuration Properties.
Example:
jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?user=test_user001&password=******&useSSL=false
Step 3: Modify the database connection information in the commonpool-mysql-client project
Modify the database connection information in the commonpool-mysql-client/src/main/resources/db.properties file using the information from Step 2: Obtain the OceanBase database URL.

Example:
The IP address of the OBServer node is
xxx.xxx.xxx.xxx.The access port is 3306.
The name of the database to access is
test.The connection account for the tenant is
test_user001.The password is
******.
Code:
...
db.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?useSSL=false
db.username=test_user001
db.password=******
...
Step 4: Run the commonpool-mysql-client project
In the project navigator view, find and expand the src/main/java directory.
Right-click the Main.java file, and then select Run As > Java Application.
View the output in the console window of Eclipse.

Project code overview
Click commonpool-mysql-client to download the project code as a compressed package named commonpool-mysql-client.zip.
After decompression, a folder named commonpool-mysql-client is created. The directory structure is as follows:
commonpool-mysql-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
File descriptions:
src: The root directory for the source code.main: The main code directory, which contains the primary logic of the application.java: The directory for Java source code.com: The Java package directory.example: The package directory for the sample project.Main.java: The main class file for the sample program. It contains the logic for creating tables, and inserting, updating, deleting, and querying data.resources: The directory for resource files, such as configuration files.db.properties: The configuration file for the connection pool. It contains the database connection parameters.pom.xml: The configuration file for the Maven project. It is used to manage project dependencies and build settings.
pom.xml code overview
The pom.xml file is the configuration file for the Maven project. It defines information such as project dependencies, plugins, and build rules. Maven is a Java project management tool that automatically downloads dependencies, compiles, and packages projects.
The pom.xml file includes the following parts:
File declaration.
This part declares that the file is an XML file, the XML version is
1.0, and the character encoding isUTF-8.Code:
<?xml version="1.0" encoding="UTF-8"?>POM namespace and model version configuration.
The
xmlnsattribute specifies the Project Object Model (POM) namespace ashttp://maven.apache.org/POM/4.0.0.The
xmlns:xsiattribute specifies the XML namespacehttp://www.w3.org/2001/XMLSchema-instance.The
xsi:schemaLocationattribute specifies the POM namespace ashttp://maven.apache.org/POM/4.0.0and the location of the POM XSD file ashttp://maven.apache.org/xsd/maven-4.0.0.xsd.The
<modelVersion>element specifies that the POM version used by this file is4.0.0.
Code:
<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> <!-- Other configurations --> </project>Basic information configuration.
The
<groupId>element specifies the project's organization ascom.example.The
<artifactId>element specifies the project's name ascommonpool-mysql-client.The
<version>element specifies the project's version number as1.0-SNAPSHOT.
Code:
<groupId>com.example</groupId> <artifactId>commonpool-mysql-client</artifactId> <version>1.0-SNAPSHOT</version>Project source file property configuration.
This part specifies the Maven compiler plugin as
maven-compiler-pluginand sets both the source and target Java versions to 8. This means that the project's source code is written using Java 8 features, and the compiled bytecode is compatible with a Java 8 runtime environment. This setting ensures that the project can correctly handle Java 8 syntax and features during compilation and at runtime.NoteJava 1.8 and Java 8 are different names for the same version.
Code:
<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>Project dependency configuration.
Add the
mysql-connector-javadependency library, which is used to interact with the database:The
<groupId>element specifies the dependency's organization asmysql.The
<artifactId>element specifies the dependency's name asmysql-connector-java.The
<version>element specifies the dependency's version number as5.1.40.
Code:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>Add the
commons-pool2dependency library to use its features and classes in the project:The
<groupId>element specifies the dependency's organization asorg.apache.commons.The
<artifactId>element specifies the dependency's name ascommons-pool2.The
<version>element specifies the dependency's version number as2.7.0.
Code:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.7.0</version> </dependency>
db.properties code overview
db.properties is the connection pool configuration file for this sample. It contains the configuration properties for the connection pool, such as the database URL, username, password, and other optional settings.
The db.properties file includes the following parts:
Database connection parameters.
Configures the database connection URL, which includes the host IP address, port number, and the database to access.
Configures the database username.
Configures the database password.
Code:
db.url=jdbc:mysql://$host:$port/$database_name?useSSL=false db.username=$user_name db.password=$passwordParameters:
$host: The domain name for the OceanBase database connection.$port: The connection port for the OceanBase database. The default port for a MySQL mode tenant is 3306.$database_name: The name of the database to access.$user_name: The connection account for the tenant.$password: The password for the account.
Other connection pool parameters.
Sets the maximum number of connections in the pool to 10. This means that the pool can have up to 10 active connections at the same time.
Sets the maximum number of idle connections in the pool to 5. When the number of connections in the pool exceeds this value, the extra connections are closed.
Sets the minimum number of idle connections in the pool to 2. The pool maintains at least two idle connections, even if no connections are in use.
Sets the maximum wait time for obtaining a connection from the pool to 5000 milliseconds. If no connections are available in the pool, the operation to obtain a connection waits until the maximum wait time is exceeded.
Code:
pool.maxTotal=10 pool.maxIdle=5 pool.minIdle=2 pool.maxWaitMillis=5000
The specific property (parameter) configuration depends on your project requirements and database characteristics. Adjust the configuration as needed.
Common configuration parameters for Commons Pool 2:
Parameter |
Description |
url |
Specifies the URL for connecting to the database. The URL includes information such as the database type, hostname, port number, and database name. |
username |
The username required to connect to the database. |
password |
The password required to connect to the database. |
maxTotal |
Specifies the maximum number of objects that can be created in the object pool. |
maxIdle |
Specifies the maximum number of idle objects that can be kept in the object pool. |
minIdle |
Specifies the minimum number of idle objects to keep in the object pool. |
blockWhenExhausted |
Specifies the behavior of the
|
maxWaitMillis |
Specifies the maximum wait time in milliseconds for the |
testOnBorrow |
Specifies whether to validate an object when the
|
testOnReturn |
Specifies whether to validate an object when the
|
testWhileIdle |
Specifies whether to validate objects when they are idle. The details are as follows:
|
timeBetweenEvictionRunsMillis |
Specifies the time interval in milliseconds for scheduling the idle object eviction thread. |
numTestsPerEvictionRun |
Specifies the number of idle objects to check each time the eviction thread is scheduled. |
Main.java code overview
The Main.java file is part of the sample program. The code demonstrates how to use Commons Pool 2 to perform database operations. The Main.java file includes the following parts:
Package definition and import of necessary classes.
Declares the package name for the current code as
com.example.Imports the
java.io.IOExceptionclass to handle input/output exceptions.Imports the
java.sql.Connectionclass, which represents a connection to the database. You can use this object to execute SQL statements and retrieve results.Imports the
java.sql.DriverManagerclass to manage driver loading and database connection establishment. You can use this class to obtain a database connection.Imports the
java.sql.ResultSetclass, which represents the result set of an SQL query. You can use this object to traverse and manipulate query results.Imports the
java.sql.SQLExceptionclass to handle exceptions related to SQL statements.Imports the
java.sql.Statementclass, which is an object used to execute SQL statements. It can be created using thecreateStatementmethod of aConnectionobject.Imports the
java.util.Propertiesclass, which is a collection of key-value pairs used to load and save configuration information. You can load database connection information from a configuration file.Imports the
org.apache.commons.pool2.ObjectPoolclass, which is an object pool interface that defines basic operations for pooled objects, such as obtaining and returning objects.Imports the
org.apache.commons.pool2.PoolUtilsclass, which provides utility methods for conveniently operating on object pools.Imports the
org.apache.commons.pool2.PooledObjectclass, which is a wrapper object that implements object pool management. You can implement this interface to manage the lifecycle of pooled objects.Imports the
org.apache.commons.pool2.impl.GenericObjectPoolclass, which is the default implementation of theObjectPoolinterface and implements the basic functions of a connection pool.Imports the
org.apache.commons.pool2.impl.GenericObjectPoolConfigclass, which is the configuration class forGenericObjectPooland is used to set the properties of the connection pool.Imports the
org.apache.commons.pool2.impl.DefaultPooledObjectclass, which is the default implementation of thePooledObjectinterface and is used to wrap pooled objects. It can contain the actual connection object and other management information.
Code:
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;Creation of the
Mainclass and definition of themainmethod.This defines a
Mainclass and amainmethod. Themainmethod demonstrates how to use the connection pool to perform a series of database operations. The steps are as follows:Define a public class named
Mainas the entry point of the program. The class name must be the same as the filename.Define a public static method
mainas the starting point of the program.Load the database configuration file:
Create a
Propertiesobject to store the database configuration information.Obtain the input stream of the
db.propertiesresource file through the class loader of the Main class. Use theload()method of thePropertiesobject to load the input stream. This action loads the key-value pairs from the properties file into thepropsobject.Catch any potential
IOExceptionand print the stack trace.
Create the database connection pool configuration:
Create a generic object pool configuration object to configure the behavior of the connection pool.
Set the maximum number of connections allowed in the pool.
Set the maximum number of idle connections allowed in the pool.
Set the minimum number of idle connections allowed in the pool.
Set the maximum wait time for obtaining a connection.
Create the database connection pool: Create a thread-safe connection pool object
connectionPool. Use aConnectionFactoryobject and apoolConfigconfiguration object to create a generic object pool, and then wrap it in a thread-safe object pool. Wrapping the connection pool ensures the safety of connection acquisition and release operations in a multi-threaded environment.Obtain a database connection. Use the
borrowObject()method of the connection pool to obtain a database connection. Use this connection to perform database operations within atryblock.Call the
createTable()method to create a table.Call the
insertData()method to insert data.Call the
selectData()method to query data.Call the
updateData()method to update data.Call the
selectData()method again to query the updated data.Call the
deleteData()method to delete data.Call the
selectData()method again to query the data after deletion.Call the
dropTable()method to drop the table.Catch and print any exceptions.
Definition of other database operation methods.
Code:
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(); } } // Method to create a table // Method to insert data // Method to update data // Method to delete data // Method to query data // Method to delete a table // Definition of the ConnectionFactory class }Method for creating a table.
This defines a method named
createTablethat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
createTable()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for creating the table.Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and create the table.Print a success message to the console.
Code:
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."); } }Method for inserting data.
This defines a method named
insertDatathat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
insertData()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for inserting data.Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and insert the data.Print a success message to the console.
Code:
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."); } }Method for updating data.
This defines a method named
updateDatathat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
updateData()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for updating data.Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and update the data.Print a success message to the console.
Code:
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."); } }Method for deleting data.
This defines a method named
deleteDatathat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
deleteData()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for deleting data.Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and delete the data.Print a success message to the console.
Code:
private static void deleteData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "DELETE FROM test_commonpool WHERE id = 2"; statement.executeUpdate(sql); System.out.println("Data deleted successfully."); } }Method for querying data.
This defines a method named
selectDatathat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
selectData()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for querying data.Use the
executeQuery()method of theStatementobject to execute thesqlstatement and store the result in aResultSetobject.Use the
resultSet.next()method to check if there is more data and enter a loop.Use the
resultSet.getInt()method to retrieve integer data from the current row. The parameter of this method is the column name.Use the
resultSet.getString()method to retrieve string data from the current row. The parameter of this method is the column name.Print the data of the current row to the console.
Code:
private static void selectData(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "SELECT * FROM test_commonpool"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); } } }Method for dropping a table.
This defines a method named
dropTablethat accepts aConnectionobject as a parameter. The steps are as follows:Define a private static method
dropTable()that accepts aConnectionobject as a parameter and declares that it may throw anSQLException.Use the
createStatement()method of the connection to create aStatementobject. Use this object in atry-with-resourcesstatement to perform database operations.Define a string variable
sqlto store the SQL statement for dropping the table.Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and drop the table.Print a success message to the console.
Code:
private static void dropTable(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "DROP TABLE test_commonpool"; statement.executeUpdate(sql); System.out.println("Table dropped successfully."); } }Definition of the
ConnectionFactoryclass.This defines a static inner class named
ConnectionFactorythat inherits from theBasePooledObjectFactoryclass. This class implements methods for creating and managing connection objects. The steps are as follows:Note@Overrideis an annotation that indicates the following method overrides a method in the parent class.Define a static inner class named
ConnectionFactorythat inherits from theorg.apache.commons.pool2.BasePooledObjectFactory<Connection>class. This class is a factory for creating and managing connection objects.Define a private, immutable string variable to store the database URL.
Define a private, immutable string variable to store the username for the database connection.
Define a private, immutable string variable to store the password for the database connection.
Define the constructor for the
ConnectionFactoryclass to initialize the member variablesurl,username, andpassword. The constructor accepts three parameters: the database URL, username, and password, and assigns these values to the corresponding member variables. This lets you pass database information when creating aConnectionFactoryobject.Override the
create()method from theBasePooledObjectFactoryclass to create a new connection object.Use the
getConnection()method of theDriverManagerclass to create and return a connection object.Override the
destroyObject()method from theBasePooledObjectFactoryclass to destroy a connection object.Call the
close()method of the connection object to close the connection.Override the
validateObject()method from theBasePooledObjectFactoryclass to validate a connection object.Call the
isValid()method of the connection object to check if the connection is valid, setting a timeout of 5000 milliseconds.Override the
wrap()method from theBasePooledObjectFactoryclass to wrap a connection object into aPooledObjectobject.Use the constructor of the
DefaultPooledObjectclass to create aPooledObjectobject, passing the connection object as a parameter.
Code:
static class ConnectionFactory extends org.apache.commons.pool2.BasePooledObjectFactory<Connection> { private final String url; private final String username; private final String password; public ConnectionFactory(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } @Override public Connection create() throws Exception { return DriverManager.getConnection(url, username, password); } @Override public void destroyObject(org.apache.commons.pool2.PooledObject<Connection> p) throws Exception { p.getObject().close(); } @Override public boolean validateObject(org.apache.commons.pool2.PooledObject<Connection> p) { try { return p.getObject().isValid(5000); } catch (SQLException e) { return false; } } @Override public PooledObject<Connection> wrap(Connection connection) { return new DefaultPooledObject<>(connection); } }
Complete code
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.example</groupId>
<artifactId>commonpool-mysql-client</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
</project>
db.properties
# Database Configuration
db.url=jdbc:mysql://$host:$port/$database_name?useSSL=false
db.username=$user_name
db.password=$password
# Connection Pool Configuration
pool.maxTotal=10
pool.maxIdle=5
pool.minIdle=2
pool.maxWaitMillis=5000
Main.java
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;
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();
}
}
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.");
}
}
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.");
}
}
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.");
}
}
private static void deleteData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "DELETE FROM test_commonpool WHERE id = 2";
statement.executeUpdate(sql);
System.out.println("Data deleted successfully.");
}
}
private static void selectData(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "SELECT * FROM test_commonpool";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
}
}
private static void dropTable(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
String sql = "DROP TABLE test_commonpool";
statement.executeUpdate(sql);
System.out.println("Table dropped successfully.");
}
}
static class ConnectionFactory extends org.apache.commons.pool2.BasePooledObjectFactory<Connection> {
private final String url;
private final String username;
private final String password;
public ConnectionFactory(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Connection create() throws Exception {
return DriverManager.getConnection(url, username, password);
}
@Override
public void destroyObject(org.apache.commons.pool2.PooledObject<Connection> p) throws Exception {
p.getObject().close();
}
@Override
public boolean validateObject(org.apache.commons.pool2.PooledObject<Connection> p) {
try {
return p.getObject().isValid(5000);
} catch (SQLException e) {
return false;
}
}
@Override
public PooledObject<Connection> wrap(Connection connection) {
return new DefaultPooledObject<>(connection);
}
}
}
References
For more information about MySQL Connector/J, see Overview of MySQL Connector/J.