This topic describes how to build an application by using Commons Pool, OceanBase Connector/J, and OceanBase Cloud. The application can perform basic database operations, including creating tables, inserting data, updating data, deleting data, querying data, and deleting tables.
Download the commonpool-oceanbase-client sample project Prerequisites
You have registered an OceanBase Cloud account and created an instance and an OceanBase Cloud Oracle-compatible tenant. For more information, see Create an instance and Create a tenant.
You have obtained the connection string of the target Oracle-compatible tenant. For more information, see Obtain the connection string.
You have installed JDK 1.8 and Maven.
You have installed Eclipse.
Note
The example code in this topic is run in Eclipse IDE for Java Developers 2022-03. You can also use other tools that you prefer.
Procedure
Note
The following procedure shows how to compile and run the project in the Windows environment using Eclipse IDE for Java Developers 2022-03. If you are using a different operating system or compiler, the procedure may vary slightly.
Step 1: Import the commonpool-oceanbase-client project into Eclipse
Open Eclipse and select File > Open Projects from File System.
In the dialog box that appears, click Directory to select the project directory, and then click Finish to complete the import.
Note
When you import a Maven project into Eclipse, it automatically detects the
pom.xmlfile in the project, downloads the required dependency libraries based on the described dependencies, and adds them to the project.
View the project.

Step 2: Modify the database connection information in the commonpool-oceanbase-client project
Modify the database connection information in the commonpool-oceanbase-client/src/main/resources/db.properties file based on the connection string information obtained in the prerequisites.
Here is an example:
...
db.url=jdbc:oceanbase://t5******.********.oceanbase.cloud:1521/test_schema001
db.username=test_user001
db.password=******
...
- The connection address is
t5******.********.oceanbase.cloud. - The access port is 1521.
- The name of the database to be accessed is
test_schema001. - The tenant connection account is
test_user. - The password is
******.
Step 3: Run the commonpool-oceanbase-client project
In the Project Explorer view, locate and expand the src/main/java directory.
Right-click the Main.java file and select Run As > Java Application.

View the output results in the Eclipse console window.

Project code
Click commonpool-oceanbase-client to download the project code, which is a compressed file named commonpool-oceanbase-client.zip.
After decompressing the file, you will find a folder named commonpool-oceanbase-client. The directory structure is as follows:
commonpool-oceanbase-client
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
File description:
src: the root directory of the source code.main: the main code directory, containing the core logic of the application.java: the directory for Java source code.com: the directory for Java package.example: the directory for the package of the sample project.Main.java: the main class program file, containing logic for creating tables, inserting, deleting, updating, and querying data.resources: the directory for resource files, including configuration files.db.properties: the configuration file for the connection pool, containing relevant database connection parameters.pom.xml: the configuration file for the Maven project, used to manage project dependencies and build settings.
Code in the pom.xml file
The pom.xml file is the configuration file of a Maven project. It defines the dependencies, plugins, and build rules of the project. Maven is a Java project management tool that can automatically download dependencies, compile, and package the project.
The code in the pom.xml file in this topic includes the following parts:
File declaration statement.
This statement declares that the file is an XML file using XML version
1.0and character encodingUTF-8.Sample code:
<?xml version="1.0" encoding="UTF-8"?>Configure the namespaces and POM model version.
- Use
xmlnsto specify the POM namespace ashttp://maven.apache.org/POM/4.0.0. - Use
xmlns:xsito specify the XML namespace ashttp://www.w3.org/2001/XMLSchema-instance. - Use
xsi:schemaLocationto specify 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. - Use the
<modelVersion>element to specify the POM model version used by the POM file as4.0.0.
Sample 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>- Use
Configure the basic information.
- Use
<groupId>to specify the project group ascom.example. - Use
<artifactId>to specify the project name ascommonpool-oceanbase-client. - Use
<version>to specify the project version as1.0-SNAPSHOT.
Sample code:
<groupId>com.example</groupId> <artifactId>commonpool-oceanbase-client</artifactId> <version>1.0-SNAPSHOT</version>- Use
Configure the properties of the project source files.
Specify the Maven compiler plugin as
maven-compiler-pluginand set both the source code and target Java versions to 8. This means that the project's source code is written using Java 8 features, and the compiled bytecode will also be compatible with the Java 8 runtime environment. This setup ensures that the project can correctly handle Java 8 syntax and features during compilation and runtime.Note
Java 1.8 and Java 8 are different names for the same version.
Sample 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>Configure the components that the project depends on.
Add the
oceanbase-clientdependency library for database interaction:- Use
<groupId>to specify the dependency group ascom.oceanbase. - Use
<artifactId>to specify the dependency name asoceanbase-client. - Use
<version>to specify the dependency version as2.4.2.
Note
This part of the code defines the project's dependency on OceanBase Connector/J V2.4.2. For information about other versions, see OceanBase JDBC driver.
Sample code:
<dependency> <groupId>com.oceanbase</groupId> <artifactId>oceanbase-client</artifactId> <version>2.4.2</version> </dependency>- Use
Add the
commons-pool2dependency library to use its features and classes in the project:- Use
<groupId>to specify the dependency group asorg.apache.commons. - Use
<artifactId>to specify the dependency name ascommons-pool2. - Use
<version>to specify the dependency version as2.7.0.
Sample code:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.7.0</version> </dependency>- Use
Introduction to db.properties
db.properties is a connection pool configuration file in the example provided in this topic. It contains the configuration parameters of the connection pool, including the database URL, username, password, and other optional parameters of the connection pool.
The code in the db.properties file provided in this topic mainly includes the following parts:
Configure the database connection parameters.
- Configure the URL of the database connection, including the host IP address, port number, and schema to be accessed.
- Configure the username of the database.
- Configure the password of the database.
Sample code:
db.url=jdbc:oceanbase://$host:$port/$schema_name db.username=$user_name db.password=$passwordParameter description:
$host: the OceanBase Cloud database connection address, obtained from the-hparameter in the connection string.$port: the OceanBase Cloud database connection port, obtained from the-Pparameter in the connection string.$schema_name: the name of the database to be accessed, obtained from the-Dparameter in the connection string.$user_name: the account name, obtained from the-uparameter in the connection string.$password: the account password, obtained from the-pparameter in the connection string.
Configure other parameters of the connection pool.
- Set the maximum number of connections in the connection pool to 10. This means that the connection pool can have a maximum of 10 connections at the same time.
- Set the maximum number of idle connections in the connection pool to 5. When the number of connections in the connection pool exceeds the maximum number of idle connections, the extra connections will be closed.
- Set the minimum number of idle connections in the connection pool to 2. At least 2 idle connections will be kept in the connection pool, even if there are no active connections.
- Set the maximum wait time for obtaining a connection from the connection pool to 5000 milliseconds. If there are no available connections in the connection pool, the operation to obtain a connection will wait until the maximum wait time is exceeded.
Sample code:
pool.maxTotal=10 pool.maxIdle=5 pool.minIdle=2 pool.maxWaitMillis=5000
Notice
The specific configuration of the parameters depends on the project requirements and the characteristics of the database. We recommend that you adjust and configure the parameters as needed.
Common connection pool parameters in Commons Pool 2:
| Parameter | Description |
|---|---|
| url | The URL of the database, which includes the database type, host name, port number, and database name. |
| username | The username required to connect to the database. |
| password | The password required to connect to the database. |
| maxTotal | The maximum number of objects that can be created in the object pool. |
| maxIdle | The maximum number of idle objects that can be kept in the object pool. |
| minIdle | The minimum number of idle objects that must be kept in the object pool. |
| blockWhenExhausted | Specifies the behavior of the borrowObject operation when the object pool is exhausted.
|
| maxWaitMillis | The maximum wait time (in milliseconds) for the borrowObject method when the object pool is exhausted. |
| testOnBorrow | Specifies whether to validate the object when the borrowObject method is called.
|
| testOnReturn | Specifies whether to validate the object when the returnObject method is called.
|
| testWhileIdle | Specifies whether to validate the objects when they are idle. The specific meanings are as follows:
|
| timeBetweenEvictionRunsMillis | The interval (in milliseconds) at which the idle object eviction thread is scheduled. |
| numTestsPerEvictionRun | The number of idle objects to check each time the idle object eviction thread is scheduled. |
Main.java code introduction
The Main.java file is part of the sample program and demonstrates how to use Commons Pool 2 to perform database operations. The code in the Main.java file in this topic includes the following parts:
Define the package and import the necessary classes.
- Declare the package name of the current code as
com.example. - Import the
java.io.IOExceptionclass to handle input and output exceptions. - Import the
java.sql.Connectionclass to represent a connection to the database. You can use this object to execute SQL statements and obtain results. - Import the
java.sql.DriverManagerclass to manage driver loading and database connection establishment. You can use this class to obtain a database connection. - Import the
java.sql.ResultSetclass to represent the result set of an SQL query. You can use this object to traverse and manipulate query results. - Import the
java.sql.SQLExceptionclass to handle exceptions related to SQL statements. - Import the
java.sql.Statementclass to represent an object for executing SQL statements. You can create this object by calling thecreateStatement()method of aConnectionobject. - Import the
java.util.Propertiesclass, which is a collection of key-value pairs, to load and save configuration information. You can load database connection information from a configuration file. - Import the
org.apache.commons.pool2.ObjectPoolclass, which is an interface for an object pool. This interface defines basic operations for pooled objects, such as object retrieval and return. - Import the
org.apache.commons.pool2.PoolUtilsclass, which provides some utility methods for conveniently operating an object pool. - Import 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. - Import the
org.apache.commons.pool2.impl.GenericObjectPoolclass, which is the default implementation of theObjectPoolinterface. This class implements the basic functionality of a connection pool. - Import the
org.apache.commons.pool2.impl.GenericObjectPoolConfigclass, which is the configuration class ofGenericObjectPool. This class is used to set the attributes of a connection pool. - Import the
org.apache.commons.pool2.impl.DefaultPooledObjectclass, which is the default implementation of thePooledObjectinterface. This class is used to manage the wrapping of pooled objects. It can contain the actual connection object and other management information.
Sample 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;- Declare the package name of the current code as
Create a
Mainclass and define themainmethod.Define a
Mainclass and amainmethod. Themainmethod is used to demonstrate how to use a connection pool to perform a series of operations on a database. The steps are as follows:Define a public class named
Mainas the entry point of the program. The class name must be consistent with the file name.Define a public static method
mainas the starting point for program execution.Load the database configuration file:
- Create a
Propertiesobject to store the database configuration information. - Use the class loader of the
Mainclass to obtain the input stream of thedb.propertiesresource file, and use theload()method of thePropertiesobject to load this input stream. The key-value pairs in the property file are loaded into thepropsobject. - Capture any
IOExceptionexceptions that may be thrown and print the exception stack trace.
- Create a
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 connection pool.
- Set the maximum number of idle connections allowed in the connection pool.
- Set the minimum number of idle connections allowed in the connection pool.
- Set the maximum wait time for obtaining a connection.
Create the database connection pool: Create a thread-safe connection pool object
connectionPool. Use theConnectionFactoryobject and thepoolConfigconfiguration object to create a generic object pool and wrap it in a thread-safe object pool. By wrapping the connection pool in a thread-safe manner, you can ensure the safety of connection acquisition and release operations in a multi-threaded environment.Obtain a database connection by calling the
borrowObject()method of the connection pool. Use this connection in thetrycode block to perform database operations.- 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 delete the table. - Capture and print any exceptions.
- Call the
Define other database operation methods.
Sample 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(); } } // Define the method for creating a table. // Define the method for inserting data. // Define the method for updating data. // Define the method for deleting data. // Define the method for querying data. // Define the method for dropping a table. // Define the ConnectionFactory class. }Define the method for creating a table.
Define 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 and use it in atry-with-resourcesstatement to execute database operations. - Define a string variable
sqlto store the SQL statement for creating a table. - Use the
executeUpdate()method of theStatementobject to execute thesqlstatement and create the table. - Output a message to the console indicating that the table was created successfully.
Sample code:
private static void createTable(Connection connection) throws SQLException { try (Statement statement = connection.createStatement()) { String sql = "CREATE TABLE test_commonpool (id NUMBER,name VARCHAR2(20))"; statement.executeUpdate(sql); System.out.println("Table created successfully."); } }- Define a private static method
Define the method for inserting data.
Define 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 and use it in atry-with-resourcesstatement to execute 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. - Output a message to the console indicating that the data was inserted successfully.
Sample 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."); } }- Define a private static method
Define the method for updating data.
Define 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 and use it in atry-with-resourcesstatement to execute 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. - Output a message to the console indicating that the data was updated successfully.
Sample 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."); } }- Define a private static method
Define the method for deleting data.
Define 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 and use it in atry-with-resourcesstatement to execute 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. - Output a message to the console indicating that the data was deleted successfully.
Sample 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."); } }- Define a private static method
Define the method for querying data.
Define a method named
selectDatathat accepts aConnectionobject as a parameter. The steps are as follows:- Define a private static method
selectData()that takes aConnectionobject as a parameter and declares that it may throw anSQLException. - Use the
createStatement()method of the connection to create aStatementobject and use it within atry-with-resourcesstatement to perform database operations. - Define a string variable
sqlto store the SQL query statement for retrieving 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 are more rows of data and enter a loop. - Use the
resultSet.getInt()method to retrieve the integer data from the current row. The parameter for this method is the column name of the data. - Use the
resultSet.getString()method to retrieve the string data from the current row. The parameter for this method is the column name of the data. - Output the data from the current row to the console.
Sample 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); } } }- Define a private static method
Define a method for dropping a table.
Define a method named
dropTable()that takes aConnectionobject as a parameter. The steps are as follows:- Define a private static method
dropTable()that takes aConnectionobject as a parameter and declares that it may throw anSQLException. - Use the
createStatement()method of the connection to create aStatementobject and use it within 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. - Output a message indicating that the table was successfully dropped to the console.
Sample 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."); } }- Define a private static method
Define a
ConnectionFactoryclass.Define a static inner class named
ConnectionFactorythat inherits from theBasePooledObjectFactoryclass and implements methods for creating and managing connection objects. The steps are as follows:Note
@Overrideis an annotation indicating that the following method overrides a method from the parent class.- Define a static inner class named
ConnectionFactorythat inherits from theorg.apache.commons.pool2.BasePooledObjectFactory<Connection>class, which is used to create and manage connection objects. - Define a private, immutable string variable to store the database URL.
- Define a private, immutable string variable to store the username for connecting to the database.
- Define a private, immutable string variable to store the password for connecting to the database.
- Define a constructor for the
ConnectionFactoryclass to initialize the class's member variablesurl,username, andpassword. The constructor takes three parameters: the database URL, the username for connecting to the database, and the password for connecting to the database. These parameters are assigned to the corresponding member variables. This way, when creating aConnectionFactoryobject, you can pass in the database information through the constructor. - Override the
create()method of theBasePooledObjectFactoryclass to create a new connection object. - Use the
getConnection()method of theDriverManagerclass to create and return a connection object. - Override the
destroyObject()method of theBasePooledObjectFactoryclass to destroy the connection object. - Call the
close()method of the connection object to close the connection. - Override the
validateObject()method of theBasePooledObjectFactoryclass to validate the connection object. - Call the
isValid()method of the connection object to check if the connection is valid and set the timeout to 5000 milliseconds. - Override the
wrap()method of theBasePooledObjectFactoryclass to wrap the connection object into aPooledObjectobject. - Use the constructor of the
DefaultPooledObjectclass to create aPooledObjectobject and pass the connection object as a parameter.
Sample 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); } }- Define a static inner class named
Complete code
<?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-oceanbase-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>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
</project>
# Database Configuration
db.url=jdbc:oceanbase://$host:$port/$schema_name
db.username=$user_name
db.password=$password
# Connection Pool Configuration
pool.maxTotal=10
pool.maxIdle=5
pool.minIdle=2
pool.maxWaitMillis=5000
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 NUMBER,name VARCHAR2(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 OceanBase Connector/J, see OceanBase JDBC driver.