This topic describes how to use a Proxool connection pool, MySQL Connector/J, and OceanBase Cloud to build an application for basic database operations, such as table creation, data insertion, data deletion, data modification, and data query.
Download the proxool-mysql-client sample project Prerequisites
You have registered an OceanBase Cloud account and have created a cluster instance. For details, refer to Create a cluster instance.
You have obtained the connection string of the instance. For more information, see Obtain the connection string.
You have installed Java Development Kit (JDK) 1.8 and Maven.
You have installed IntelliJ IDEA.
Note
This topic uses IntelliJ IDEA Community Edition 2021.3.2 to run the sample code. You can also choose a suitable tool as needed.
Procedure
Note
The following procedure uses IntelliJ IDEA Community Edition 2021.3.2 to compile and run this project in Windows. If you use another operating system or compiler, the procedure can be slightly different.
Step 1: Import the proxool-mysql-client project to IntelliJ IDEA
Start IntelliJ IDEA.
On the welcome page, click Open, navigate to the directory where the project is located, select the root directory of the project, and click OK.

IntelliJ IDEA automatically detects the project type and loads the project.
Note
When you use IntelliJ IDEA to import a Maven project, IntelliJ IDEA automatically detects the
pom.xmlfile in the project, downloads the required dependency libraries based on the dependencies described in the file, and adds them to the project.
(Optional) Manually import the unparsed dependencies.
If the dependencies in the
pom.xmlfile are automatically imported to the project, ignore this step.The information in the Sync pane of IntelliJ IDEA shows that the
proxool-cglibandproxooldependencies are not parsed. The.jarfiles of theproxool-cglibandproxooldependencies are located in thelibfolder of the root directory of theproxool-mysql-clientproject. Perform the following steps to add these files to the project:- In IntelliJ IDEA, choose File > Project Structure.
- In the left-side pane, click Modules.
- In the right-side pane, click the Dependencies tab. In the upper-right corner of this tab, click the plus sign (+) and select JARs or directories.
- In the dialog box that appears, navigate to the
libdirectory where the.jarfiles are stored, select the.jarfiles, and click OK. - The added
.jarfiles appear in the list on the Dependencies tab. - Click Apply or OK to save the changes.

Step 2: Modify the database connection information in the proxool-mysql-client project
Modify the database connection information in the db.properties file in the proxool-mysql-client/src/main/resources/ directory based on the obtained connection string mentioned in the "Prerequisites" section.
Here is an example:
- The endpoint is
t5******.********.oceanbase.cloud. - The access port is
3306. - The name of the database to be accessed is
test. - The instance account is
test_user. - The password is
******.
The sample code is as follows:
...
jdbc-1.proxool.driver-url=jdbc:mysql://t5******.********.oceanbase.cloud:3306/test?useSSL=false
jdbc-1.user=test_user
jdbc-1.password=******
...
Step 4: Run the proxool-mysql-client project
In the navigation pane of the project, find and expand the src/main/java/com.example directory.
Right-click the Main file and choose Run 'Main.main()'.
IntelliJ IDEA automatically compiles and runs this project and displays the output results on the running panel.

You can also execute the following SQL statement in OceanBase Client (OBClient) to view the results:
obclient [(none)]> SELECT * FROM test.test_proxool;The return result is as follows:
+------+---------------+ | c1 | c2 | +------+---------------+ | 6 | test_update | | 7 | test_insert7 | | 8 | test_insert8 | | 9 | test_insert9 | | 10 | test_insert10 | +------+---------------+ 5 rows in set
Project code
Click here to download the project code, which is a package named proxool-mysql-client.zip.
Decompress the package to obtain a folder named proxool-mysql-client. The directory structure is as follows:
proxool-mysql-client
├── lib
│ ├── proxool-0.9.1.jar
│ └── proxool-cglib.jar
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── Main.java
│ └── resources
│ └── db.properties
└── pom.xml
The files and directories are described as follows:
lib: a directory that stores the dependency libraries required by the project.proxool-0.9.1.jar: library files of the Proxool connection pool.proxool-cglib.jar: CGLib files for the Proxool connection pool.src: the root directory that stores the source code.main: a directory that stores the main code, including the major logic of the application.java: a directory that stores the Java source code.com: a directory that stores the Java package.example: a directory that stores the packages of the sample project.Main.java: a sample file of themainclass that contains logic such as the table creation, data insertion, data deletion, data modification, and data query logic.resources: a directory that stores resource files, including configuration files.db.properties: the configuration file of the connection pool, which contains relevant database connection parameters.pom.xml: the configuration file of the Maven project, which is used to manage project dependencies and build settings.
Code in pom.xml
pom.xml is the configuration file of the Maven project, which defines the dependencies, plug-ins, and build rules of the project. Maven is a Java project management tool that can automatically download dependencies and compile and package projects.
Perform the following steps to configure the pom.xml file:
Declare the file.
Declare the file to be an XML file that uses XML standard 1.0 and the character encoding UTF-8.
The sample code is as follows:
<?xml version="1.0" encoding="UTF-8"?>Configure namespaces and the POM model version.
xmlns: the default XML namespace for the POM, which is set tohttp://maven.apache.org/POM/4.0.0.xmlns:xsi: the XML namespace for XML elements prefixed withxsi, which is set tohttp://www.w3.org/2001/XMLSchema-instance.xsi:schemaLocation: the location of an XML schema definition (XSD) file. The value consists of two parts: the default XML namespace(http://maven.apache.org/POM/4.0.0)and the URI of the XSD file (http://maven.apache.org/xsd/maven-4.0.0.xsd).<modelVersion>: the POM model version used by the POM file, which is set to 4.0.0.
The sample code is as follows:
<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>Configure basic information.
<groupId>: the ID of the group to which the project belongs, which is set tocom.example.<artifactId>: the name of the project, which is set toproxool-mysql-client.<version>: the project version, which is set to1.0-SNAPSHOT.
The sample code is as follows:
<groupId>com.example</groupId> <artifactId>proxool-mysql-client</artifactId> <version>1.0-SNAPSHOT</version>Configure the attributes of the project source file.
Specify
maven-compiler-pluginas the compiler plug-in of Maven, and set the source code version and target code version of the compiler to Java 8. This means that the project source code is compiled by using Java 8 and the compiled bytecode is compatible with the Java 8 runtime environment. This ensures that Java 8 syntax and characteristics can be correctly processed during the compilation and running of the project.Note
Java 1.8 and Java 8 are different names for the same version.
The sample code is as follows:
<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 on which the project depends.
Define the components on which the project depends by using
<dependency>.Add the
mysql-connector-javalibrary for connecting to and operating the database and configure the following parameters:<groupId>: the ID of the group to which the dependency belongs, which is set tomysql.<artifactId>: the name of the dependency, which is set tomysql-connector-java.<version>: the version of the dependency, which is set to5.1.47.
The sample code is as follows:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>Add the
proxool-cglibdependency library, which is a CGLib library for the Proxool connection pool, and configure the following parameters:<groupId>: the ID of the group to which the dependency belongs, which is set toproxool.<artifactId>: the name of the dependency, which is set toproxool-cglib.<version>: the version of the dependency, which is set to0.9.1.
The sample code is as follows:
<dependency> <groupId>proxool</groupId> <artifactId>proxool-cglib</artifactId> <version>0.9.1</version> </dependency>Add the
proxooldependency library, which is the core library of the Proxool connection pool, and configure the following parameters:<groupId>: the ID of the group to which the dependency belongs, which is set toproxool.<artifactId>: the name of the dependency, which is set toproxool.<version>: the version of the dependency, which is set to0.9.1.
The sample code is as follows:
<dependency> <groupId>proxool</groupId> <artifactId>proxool</artifactId> <version>0.9.1</version> </dependency>Add the
commons-loggingdependency library, which is a general log library for recording logs in the application, and configure the following parameters:<groupId>: the ID of the group to which the dependency belongs, which is set tocommons-logging.<artifactId>: the name of the dependency, which is set tocommons-logging.<version>: the version of the dependency, which is set to1.2.
The sample code is as follows:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
Code in db.properties
db.properties is a sample configuration file of the connection pool.
Note
When you use the .properties file to configure the Proxool connection pool, observe the following rules:
- Each connection pool is identified by a unique custom name prefixed with
jdbc. - Proxool attributes are prefixed with
proxool.. You can configure the Proxool connection pool based on these attributes. - Attributes that are not prefixed with
jdbcwill be ignored and not used by the Proxool connection pool. - Attributes that are not prefixed with
proxool.. are passed to actual database connections, namely, the database driver.
The db.properties file in this topic is a sample configuration file used to configure the connection pool attributes of a data source named jdbc-1. Perform the following steps to configure the db.properties file:
Set the alias of the data source to
TEST.The sample code is as follows:
jdbc-1.proxool.alias=TESTConfigure database connection parameters.
- Specify the class name of the driver, which is set to the class name
com.mysql.jdbc.Driver. - Specify the URL for connecting to the database, including the host IP address, port number, database to be accessed, and additional connection attributes.
- Specify the username for connecting to the database.
- Specify the password for connecting to the database.
The sample code is as follows:
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver jdbc-1.proxool.driver-url=jdbc:mysql://$host:$port/$database_name?useSSL=false jdbc-1.user=$user_name jdbc-1.password=$passwordThe parameters are described as follows:
$host: the access address of OceanBase Cloud. The value is sourced from the-hparameter in the connection string.$port: the access port of OceanBase Cloud. The value is sourced from the-Pparameter in the connection string.$database_name: the name of the database to be accessed. The value is sourced from the-Dparameter in the connection string.$user_name: the account name. The value is sourced from the-uparameter in the connection string.$password: the account password. The value is sourced from the-pparameter in the connection string.
- Specify the class name of the driver, which is set to the class name
Configure other parameters of the Proxool connection pool.
- Set the maximum number of connections in the connection pool to 8.
- Set the minimum number of connections in the connection pool to 5.
- Set the number of available connections in the connection pool to 4.
- Enable the Verbose mode to show more log information.
- Set the statistics collection cycles of the connection pool to 10s, 1 minute, and 1 day.
- Set the log level of the statistics to
ERROR.
The sample code is as follows:
jdbc-1.proxool.maximum-connection-count=8 jdbc-1.proxool.minimum-connection-count=5 jdbc-1.proxool.prototype-count=4 jdbc-1.proxool.verbose=true jdbc-1.proxool.statistics=10s,1m,1d jdbc-1.proxool.statistics-log-level=error
Notice
The actual parameter configurations depend on the project requirements and database characteristics. We recommend that you adjust and configure the parameters based on the actual situation. For more information about parameters of the Proxool connection pool, see Properties.
General parameters
| Parameter | Default value | Description |
|---|---|---|
| alias | N/A | The alias of the connection pool. You can identify a connection pool by using an alias. This is helpful when multiple connection pools exist. |
| driver-class | N/A | The class name of the database driver. |
| driver-url | N/A | The URL for connecting to the database, including the host IP address, port number, schema to be accessed, and optional database driver parameters. |
| username | N/A | The username for connecting to the database. |
| password | N/A | The password for connecting to the database. |
| maximum-connection-count | 15 | The maximum number of connections allowed in the connection pool. The default value is 15, which indicates that at most 15 connections can be created in the connection pool. |
| minimum-connection-count | 5 | The minimum number of connections in the connection pool. The default value is 5, which indicates that the connection pool contains at least five connections. |
| prototype-count | 0 | The number of prototype connections in the connection pool. The default value is 0, which indicates that the connection pool will not actively create extra connections. |
| verbose | false | Specifies whether to enable the Verbose mode for the connection pool. The default value is false, which indicates the Quiet mode. When verbose is set to true, the connection pool returns more detailed information to facilitate debugging and monitoring for developers. The information can include the status of the connection pool, the creation and release of connections, and the usage of connections. Enabling the Verbose mode can help developers better understand the running status of the connection pool and check whether connections are properly allocated and recycled. This is very helpful in troubleshooting connection leaks and performance issues, as well as in system tuning. In a production environment, we recommend that you do not set verbose to true. This is because in Verbose mode, a large amount of information is generated, which can compromise system performance and affect the log file size. We recommend that you set verbose to false in general cases and temporarily enable the Verbose mode for debugging and monitoring when necessary. |
| statistics | null | The sampling cycles of usage statistics of the connection pool. You can specify multiple comma-separated values in the format of time + unit. For example, 10s,15m indicates that statistics are sampled every 10 seconds and every 15 minutes. Supported units are s (seconds), m (minutes), h (hours), and d (days). The default value is null, which specifies to disable statistics collection. When the statistics parameter is specified, statistics of the connection pool, such as the number of active connections, number of idle connections, and number of connection requests, are periodically collected. The sampling cycles determine the granularity and sampling rate of statistics. |
| statistics-log-level | null | The log level of statistics, namely, the trace type of log statistics. Supported log levels are DEBUG, INFO, WARN, ERROR, and FATAL. The default value is null, which specifies not to record statistics logs. When the statistics-log-level parameter is specified, the connection pool records generated statistics at the specified log level. The statistics can include the status of the connection pool, the creation and release of connections, and the usage of connections. |
| test-after-use | N/A | Specifies whether to verify a connection after it is closed. If you set the value to true and specify house-keeping-test-sql, each connection is verified when it is closed, namely returned to the connection pool. A connection that fails the verification will be abandoned. When a connection is no longer required, it is released and returned to the connection pool. test-after-use is specified so that connections returned to the connection pool are verified, thereby ensuring the availability and validity of the connections. Generally, connections are verified by using the SQL statement specified by house-keeping-test-sql. After the test-after-use feature is enabled, unavailable connections can be detected and removed from the connection pool in a timely manner, thereby preventing the application from obtaining an invalid connection. This can also improve the stability and reliability of the application. To use the test-after-use feature, you must configure the house-keeping-test-sql parameter, which specifies the SQL statement for verifying connections. This way, the connection pool can verify connections based on the rule defined in house-keeping-test-sql. |
| house-keeping-test-sql | N/A | The SQL statement for verifying idle connections in the connection pool. When the housekeeping thread of the connection pool detects idle connections, it executes this SQL statement to verify these connections. The verification SQL statement will quickly execute. For example, the verification SQL statement is an SQL statement for checking the current date. If this parameter is not specified, connections are not verified. The SELECT CURRENT_DATE or SELECT 1 statement can be used in the MySQL compatible mode. The SELECT sysdate FROM DUAL or SELECT 1 FROM DUAL statement can be used in the Oracle compatible mode. |
| trace | false | Specifies whether to record each SQL call in logs. If you set the value to true, each SQL call is recorded in logs at the DEBUG level, and the execution time is also recorded. You can also register with ConnectionListener to obtain the information. For more information about ConnectionListener, see ProxoolFacade. The default value is false. After the trace feature is enabled, a large number of logs can be generated, especially in the case of concurrent or frequent SQL calls. In a production environment, we recommend that you do not enable the trace feature to avoid generating excessive logs and compromising system performance. |
| maximum-connection-lifetime | 4 hours | The maximum lifetime of a connection, namely the longest time for which a connection can exist before it is destroyed, in ms. The default value is 4 hours. The lifetime of a connection refers to the duration from when the connection is created to when it is destroyed. You can configure the maximum-connection-lifetime parameter to limit the maximum time for which a connection can exist in the connection pool. This can avoid connections that have not been used for a long time and prevent resources from being exposed. |
| maximum-active-time | 5 minutes | The maximum active period of a thread. When the housekeeping thread of the connection pool detects a thread whose active period exceeds the specified value, it will terminate the thread. Therefore, you must specify a value greater than the longest response time expected. The default value is 5 minutes. The housekeeping thread will terminate excess available connections, such as connections that are not in use and connections that have been active for a period of time longer than the specified value of this parameter. The number of connections retained must be equal to or greater than the value of minimum-connection-count. The housekeeping thread periodically checks connections at an interval specified by house-keeping-sleep-time. |
| maximum-new-connections | N/A | The maximum number of new connections established at a time. This parameter has been deprecated. We recommend that you use the simultaneous-build-throttle parameter instead. |
| simultaneous-build-throttle | 10 | The maximum number of connections that can be simultaneously established at any time, namely, the maximum number of new connections that are established but are unavailable. The establishment of a connection can involve multiple threads, for example, when a connection is established as needed. In addition, it takes time for an established connection to become available. Therefore, a mechanism is required to prevent a large number of threads from deciding to establish connections at the same time. The simultaneous-build-throttle parameter aims to limit the number of new connections established at the same time, so as to control the concurrency of the connection pool. When the maximum number of concurrent connections is reached, threads that request new connections will be blocked until a connection is available or the specified timeout value is reached. You can configure the simultaneous-build-throttle parameter to balance the concurrency and the resource consumption of the connection pool. The default value is 10, which indicates that at most 10 connections can be established at the same time. |
| overload-without-refusal-lifetime | 60 | A value for determining the status of the connection pool. If the connection pool rejects a connection request within the specified time (in ms), the connection pool is overloaded. The default timeout value is 60 seconds. |
| test-before-use | N/A | Specifies whether to verify each connection before it is provided. If you set the value to true, each connection is verified by using the SQL statement specified by house-keeping-test-sql before it is provided to the application. If a connection fails the verification, it is abandoned. The connection pool selects another available connection. If all connections fail the verification, a new connection is created. If the new connection fails the verification, an SQLException is thrown. For a MySQL database, the autoReconnect parameter must be added to the connection parameters and be set to true. Otherwise, reconnection is not supported even if test-before-use is set to true. |
| fatal-sql-exception | null | A feature for detecting and handling SQLExceptions. The value is a list of message segments separated with commas (,). When an SQLException occurs, its message is compared against these message segments. If the message of the exception contains any specified message segment (case-sensitive), the exception is considered fatal. The connection is abandoned. No matter what the case, the SQLException is thrown again so that the user knows what happens. You can also configure another exception to be thrown. For more information, see the description of the fatal-sql-exception-wrapper-class parameter. The default value is null. If the fatal-sql-exception-wrapper-class parameter is specified, you can configure a substitute exception class to be thrown. This allows you to define the methods for handling SQLExceptions. |
| fatal-sql-exception-wrapper-class | null | The wrapper class for fatal SQLExceptions. If the fatal-sql-exception parameter is specified, after a fatal SQLException occurs, the default behavior is to discard the exception that causes the fatal SQLException and throw the original exception to the user. By using the fatal-sql-exception-wrapper-class parameter, you can wrap the SQLException in any exception inherited from SQLException or RuntimeException. If you do not want to build an exception class, you can use the FatalSQLException or FatalRuntimeException class provided by Proxool. To use these classes, you must set fatal-sql-exception-wrapper-class to org.logicalcobwebs.proxool.FatalSQLException or org.logicalcobwebs.proxool.FatalRuntimeException. The default value is null, which indicates that fatal SQLExceptions are not wrapped. The default value is null. The wrapper class must be a subclass of SQLException or RuntimeException. |
| house-keeping-sleep-time | 30s | The sleeping time of the housekeeping thread of the connection pool. The housekeeping thread checks the status of all connections and determines whether to destroy or create connections. The default value is 30s, which indicates that the housekeeping thread executes the maintenance task every 30s. |
| injectable-connection-interface | N/A | Allows Proxool to implement the methods defined in the delegate Connection object. |
| injectable-statement-interface | N/A | Allows Proxool to implement the methods defined in the delegate Statement object. |
| injectable-prepared-statement-interface | N/A | Allows Proxool to implement the methods defined in the delegate PreparedStatement object. |
| injectable-callable-statement-interface | N/A | Allows Proxool to implement the methods defined in the delegate CallableStatement object. |
| jndi-name | N/A | The registered name of the connection pool in Java Naming and Directory Interface (JNDI). |
Code in Main.java
The Main.java file is a part of the sample application. It demonstrates the process of obtaining a database connection from the Proxool connection pool, executing a series of database operations, such as table creation, data insertion, data deletion, data modification, and data query, and returning the query result.
Perform the following steps to configure the Main.java file:
Import the required classes and interfaces.
Define the package where the code resides and import relevant Proxool and JDBC classes. These classes are used to configure and manage the database connection pool and execute SQL statements. The Proxool connection pool can improve the database performance and reliability. Perform the following steps:
- Define the package where the code resides as
com.example. This package stores the current Java classes. - Import the Proxool configuration class
org.logicalcobwebs.proxool.configuration.PropertyConfigurator. - Import the input stream class
java.io.InputStreamfor reading configuration files. - Import the JDBC Connection class
java.sql.Connection. - Import the JDBC DriverManager class
java.sql.DriverManager. - Import the JDBC ResultSet class
java.sql.ResultSet. - Import the JDBC Statement class
java.sql.Statement. - Import the Properties class
java.util.Propertiesfor loading configuration files.
The sample code is as follows:
package com.example; import org.logicalcobwebs.proxool.configuration.PropertyConfigurator; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties;- Define the package where the code resides as
Define class names and methods.
Define an entry method for Java applications. Obtain the database connection information from the configuration file. After establishing a database connection by using the Proxool driver, call the defined methods in sequence to execute DDL, DML, and query statements. Capture and return possible exceptions. This code segment aims to execute database operations and record logs by using the log recorder. Perform the following steps:
Define a public class named
Main.Define a private static constant named
DB_PROPERTIES_FILEto indicate the path where the database configuration file is located. This constant can be referenced in code to load and read the configuration file.Define a public static method named
main, which is used as the execution start point of the application.Capture code blocks with possible exceptions.
- Create a
Propertiesobject for reading attribute values from the configuration file. - Use the class loader of the
Mainclass to obtain the input stream of the configuration file. - Use the input stream to load the attributes in the configuration file to the
Propertiesobject. - Configure the connection pool based on the loaded attribute values.
- Dynamically load the Proxool database driver.
- Establish a database connection by using the Proxool driver.
- Create a
Statementobject. - Call the defined method
executeDDLStatements()to execute a DDL statement to create a table. - Call the defined method
executeDMLStatements()to execute DML statements to insert, update, and delete data. - Call the defined method
executeQueryStatements()to execute a query statement to obtain data.
- Create a
Capture and return possible exceptions.
Define methods for creating tables, executing DML statements, and querying data.
The sample code is as follows:
public class Main { private static final String DB_PROPERTIES_FILE = "/db.properties"; public static void main(String[] args) { try { Properties properties = new Properties(); InputStream is = Main.class.getResourceAsStream(DB_PROPERTIES_FILE); properties.load(is); PropertyConfigurator.configure(properties); Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); try (Connection conn = DriverManager.getConnection("proxool.TEST"); Statement stmt = conn.createStatement()) { executeDDLStatements(stmt); executeDMLStatements(stmt); executeQueryStatements(stmt); } } catch (Exception e) { e.printStackTrace(); } } // Define a method for creating tables. // Define a method for executing DML statements. // Define a method for querying data. }Define a method for creating tables.
Define a private static method
executeDDLStatements()for executing DDL statements, including table creation statements. Perform the following steps:- Define a private static method
executeDDLStatements(). The method receives aStatementobject as parameters and can throw an exception. - Call the
execute()method to execute an SQL statement to create a table namedtest_proxool. The table has two columns:c1andc2, which are respectively of theINTandVARCHAR(32)types.
The sample code is as follows:
private static void executeDDLStatements(Statement stmt) throws Exception { stmt.execute("CREATE TABLE test_proxool (c1 INT, c2 VARCHAR(32))"); }- Define a private static method
Define a method for executing DML statements.
Define a private static method
executeDMLStatements()for executing DML statements to insert, delete, and update data. Perform the following steps:- Define a private static method
executeDMLStatements(). The method receives aStatementobject as parameters. If an exception occurs during the execution, the method throws an exception. - Use the
FORloop to perform 10 rounds of iterations. In the loop, call theexecute()method to execute anINSERTstatement to insert theivariable and relevant string values into thetest_proxooltable. - Execute a
DELETEstatement to delete rows whosec1column values are smaller than or equal to5from thetest_proxooltable. - Execute an
UPDATEstatement to update thec2column values of the rows in thetest_proxooltable whosec1column values are6totest_update.
The sample code is as follows:
private static void executeDMLStatements(Statement stmt) throws Exception { for (int i = 1; i <= 10; i++) { stmt.execute("INSERT INTO test_proxool VALUES (" + i + ",'test_insert" + i + "')"); } stmt.execute("DELETE FROM test_proxool WHERE c1 <= 5"); stmt.execute("UPDATE test_proxool SET c2 = 'test_update' WHERE c1 = 6"); }- Define a private static method
Define a method for querying data.
Define a private static method
executeQueryStatements()for executing theSELECTstatement and processing the result. Perform the following steps:- Define a private static method
executeQueryStatements(). The method receives aStatementobject as parameters. If an exception occurs during the execution, the method throws an exception. - Call the
executeQuery()method to execute aSELECTstatement and store the result in aResultSetobject namedrs. Here, all data in thetest_proxooltable is returned for the query. Execute thetry-with-resourcesblock and make sure that theResultSetobject is automatically closed after being used. - Use the
WHILEloop and thenext()method to iterate each row in theResultSetobject namedrs. Thers.next()method moves the pointer to the next row in the result set in each iteration. The method returnstrueif a next row exists, and returnsfalseif otherwise. In aWHILEloop, if thers.next()method returnstrue, more rows are available. The code in the loop is executed, and the data in the current row is processed. After the data in all rows is processed, thers.next()method returnsfalse, and the loop ends. - Call the
getInt()andgetString()methods to obtain the values of specified columns in the current row and return the values to the console. Here, the values of thec1andc2columns are returned. Call thegetInt()method to obtain integer values and call thegetString()method to obtain string values.
The sample code is as follows:
private static void executeQueryStatements(Statement stmt) throws Exception { try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_proxool")) { while (rs.next()) { System.out.println(rs.getInt("c1") + " " + rs.getString("c2")); } } }- Define a private static method
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.oceanbase</groupId>
<artifactId>proxool-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.47</version>
</dependency>
<dependency>
<groupId>proxool</groupId>
<artifactId>proxool-cglib</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>proxool</groupId>
<artifactId>proxool</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
#alias: the alias of the data source
jdbc-1.proxool.alias=TEST
#driver-class: driver name
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver
#driver-url: url connection string, username and password must be determined
jdbc-1.proxool.driver-url=jdbc:mysql://$host:$port/$database_name?useSSL=false
jdbc-1.user=$user_name
jdbc-1.password=$password
#The maximum number of database connections. The default is 15
jdbc-1.proxool.maximum-connection-count=8
#The minimum number of database connections, defaults to 5
jdbc-1.proxool.minimum-connection-count=5
#The number of available connections in the Connection pool. If the number of connections in the current Connection pool is less than this value, new connections will be established (assuming that the maximum number of available connections is not exceeded). For example, if we have three active connections and two available connections, and our prototype count is 4, the database Connection pool will try to establish another two connections. This is different from the minimum connection count Minimum connection count also counts active connections. Prototype count is the number of spare connections
jdbc-1.proxool.prototype-count=4
#verbose: detailed information settings. Parameter bool value
jdbc-1.proxool.verbose=true
#statistics: connection pool usage statistics. Parameter "10s, 1m, 1d"
jdbc-1.proxool.statistics=10s,1m,1d
#statistics-log-level: log statistics tracking type. Parameter 'ERROR' or 'INFO'
jdbc-1.proxool.statistics-log-level=error
package com.example;
import org.logicalcobwebs.proxool.configuration.PropertyConfigurator;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class Main {
private static final String DB_PROPERTIES_FILE = "/db.properties";
public static void main(String[] args) {
try {
Properties properties = new Properties();
InputStream is = Main.class.getResourceAsStream(DB_PROPERTIES_FILE);
properties.load(is);
PropertyConfigurator.configure(properties);
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
try (Connection conn = DriverManager.getConnection("proxool.TEST");
Statement stmt = conn.createStatement()) {
executeDDLStatements(stmt);
executeDMLStatements(stmt);
executeQueryStatements(stmt);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void executeDDLStatements(Statement stmt) throws Exception {
stmt.execute("CREATE TABLE test_proxool (c1 INT, c2 VARCHAR(32))");
}
private static void executeDMLStatements(Statement stmt) throws Exception {
for (int i = 1; i <= 10; i++) {
stmt.execute("INSERT INTO test_proxool VALUES (" + i + ",'test_insert" + i + "')");
}
stmt.execute("DELETE FROM test_proxool WHERE c1 <= 5");
stmt.execute("UPDATE test_proxool SET c2 = 'test_update' WHERE c1 = 6");
}
private static void executeQueryStatements(Statement stmt) throws Exception {
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_proxool")) {
while (rs.next()) {
System.out.println(rs.getInt("c1") + " " + rs.getString("c2"));
}
}
}
}
References
- For more information about MySQL Connector/J, see Overview of MySQL Connector/J.
- For more information about the Proxool connection pool, see Introduction for Users.