C3P0连接池Java示例
时间:2020-01-09 10:35:21 来源:igfitidea点击:
在本文中,我们将介绍如何使用C3P0在应用程序中配置连接池。
MChange C3P0的Maven依赖关系
如果我们使用的是Maven,则可以在pom.xml中添加以下依赖项
<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency>
我们也可以直接从以下位置下载jar,然后将其放入应用程序的类路径中。
https://sourceforge.net/projects/c3p0/
我们需要在类路径中包含的jars是lib / c3p0-0.9.5.5.jar和lib / mchange-commons-java-0.2.19.jar
C3P0连接池Java示例
在示例数据库中使用的是MySQL,它连接到theitroad架构,表是EMPLOYEE,其列为id,FIRST_NAME,LAST_NAME和DEPARTMENT。
创建c3p0池数据源的最佳方法是实例化ComboPooledDataSource类的实例,并提供用于连接数据库和连接池的属性。
我们需要设置的与数据库相关的配置是驱动程序类,URL,用户名和密码。
与连接池相关的配置不属于以下情况
- acquisitionIncrement –确定当一个c3p0池用尽Connections时将尝试获取多少个Connections。默认值为3.
- initialPoolSize –池在启动时将尝试获取的连接数。默认值为3.
- maxPoolSize –池在任何给定时间将维持的最大连接数。默认值为15.
- maxIdleTime –秒,连接可以保持池状态,但在丢弃之前未使用。零表示空闲连接永不过期。默认值为0。
- minPoolSize –池在任何给定时间将维持的最小连接数。默认值为3.
与数据库凭据和连接池相关的配置属性保存在属性文件(db.properties)中。
DB.DRIVER_CLASS=com.mysql.cj.jdbc.Driver DB.DB_URL=jdbc:mysql://localhost:3306/theitroad DB.DB_USER=root DB.DB_PASSWORD=admin DB.INITIAL_POOL_SIZE=5 DB.MAX_POOL_SIZE=5
以下类用于创建ComboPooledDataSource。
import java.beans.PropertyVetoException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DSCreator { private static ComboPooledDataSource pooledDS; static { try { pooledDS = new ComboPooledDataSource(); Properties properties = new Properties(); // Loading properties file from classpath InputStream inputStream = DSCreator.class .getClassLoader() .getResourceAsStream("db.properties"); if(inputStream == null){ throw new IOException("File not found"); } properties.load(inputStream); pooledDS.setDriverClass(properties.getProperty("DB.DRIVER_CLASS")); pooledDS.setJdbcUrl(properties.getProperty("DB.DB_URL")); pooledDS.setUser(properties.getProperty("DB.DB_USER")); pooledDS.setPassword(properties.getProperty("DB.DB_PASSWORD")); pooledDS.setInitialPoolSize(Integer.parseInt(properties.getProperty("DB.INITIAL_POOL_SIZE"))); // Default anyway pooledDS.setAcquireIncrement(3); pooledDS.setMaxPoolSize(Integer.parseInt(properties.getProperty("DB.MAX_POOL_SIZE"))); }catch(IOException | PropertyVetoException e) { e.printStackTrace(); } } public static DataSource getDataSource() { return pooledDS; } }
测试类,该类使用返回的DataSource对象创建连接并查询数据库。
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; public class DSDemo { public static void main(String[] args) { DSDemo dsDemo = new DSDemo(); dsDemo.displayEmployeeById(16); } private void displayEmployeeById(int id){ Connection connection = null; String selectSQL = "SELECT * FROM EMPLOYEE WHERE id = ?"; PreparedStatement prepStmt = null; try { DataSource ds = DSCreator.getDataSource(); connection = ds.getConnection(); prepStmt = connection.prepareStatement(selectSQL); prepStmt.setInt(1, id); ResultSet rs = prepStmt.executeQuery(); while(rs.next()){ System.out.println("id: " + rs.getInt("id")); System.out.println("First Name: " + rs.getString("FIRST_NAME")); System.out.println("Last Name: " + rs.getString("LAST_NAME")); System.out.println("Department: " + rs.getString("DEPARTMENT")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(connection != null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }