c3p0数据库连接池的配置 以及 简单的JDBCUtils的实现

c3p0数据库连接池的配置以及简单的工具类的实现

首先了解一下什么是C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

C3P0是数据库连接池,我们为什么要用数据库连接池呢?

对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。
数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。

数据库连接池的优势

资源重用 、更快的系统响应速度 、新的资源分配手段 、统一的连接管理,避免数据库连接泄漏等


了解了什么是C3P0后,那么我们应该怎么使用呢?

首先我们需要几个jar包:
在这里插入图片描述
上面的几个jar包分别是:c3p0数据库连接池的jar包,c3p0数据库连接池的辅助jar包 以及 连接mysql数据库的jar包。分别Build Path一下。

jar包准备好之后呢,我们就可以来配置连接池啦,配置c3p0数据库连接池需要在项目src目录下创建一个c3p0-config的xml文件。编写如下:

c3p0的基本配置:


<c3p0-config>
	
	<named-config name="democ3p0">
		
		<property name="driverClass">com.mysql.jdbc.Driverproperty>
		<property name="jdbcUrl">jdbc:mysql:///jdbcdemo20190804property>
		<property name="user">rootproperty>
		<property name="password">rootproperty>
		
		
		
		<property name="acquireIncrement">5property>
		
		<property name="initialPoolSize">5property>
		
		<property name="minPoolSize">5property>
		
		<property name="maxPoolSize">10property>
		
		<property name="maxStatements">20property>
		
		<property name="maxStatementsPerConnection">5property>
	named-config>
	
c3p0-config>

当然关于c3p0数据库连接池的配置还有很多,为了更好的体验,将在本篇博客下面提供。

基本的c3p0连接池的配置已经完成了,之后呢我们可以编写简单的JDBCTools工具类

JDBCTools:

package com.xyj.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * JDBC工具类
 */
public class JDBCTools {
	//创建数据源
	private static DataSource dataSource=null;
	
	//使用静态代码块初始化数据源
	static {
		dataSource=new ComboPooledDataSource("democ3p0");//ComboPooledDataSource C3p0的数据源 "democ3p0"是"c3p0-config.xml"文件中节点的name值
	}
	
	//获取连接的方法
	public static Connection getConnection() throws SQLException {
		return dataSource.getConnection();
	}
	
	//关闭连接的方法
	public static void close(Connection conn,Statement stmt,ResultSet rs) {
		if(rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(stmt!=null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null) {
			try {
				//数据连接池的Connection,进行close()的时候,不是真正的关闭
				//而是把连接返回给连接池
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

如何来测试我们的工具类是否正确呢?

@org.junit.Test
	public void testConnection(){
		Connection conn=null;
		try {
			conn = JDBCTools.getConnection();
			System.out.println(conn);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCTools.close(conn, null, null);
		}
	}

最后运行如下:
c3p0数据库连接池的配置 以及 简单的JDBCUtils的实现_第1张图片如图所示,我们正确的获得了Connection连接。


!!!C3P0的更多配置信息如下:


    <property name="acquireIncrement">3property>

    
    <property name="acquireRetryAttempts">30property>
 
    
    <property name="acquireRetryDelay">1000property>
 
    
    <property name="autoCommitOnClose">falseproperty>
 
    
    <property name="automaticTestTable">Testproperty>
 
    
    <property name="breakAfterAcquireFailure">falseproperty>
 
     
    <property name="checkoutTimeout">100property>
 
    
    <property name="connectionTesterClassName">property>
 
    
    <property name="factoryClassLocation">nullproperty>
 
     
    <property name="forceIgnoreUnresolvedTransactions">falseproperty>
 
     
    <property name="idleConnectionTestPeriod">60property>
 
     
    <property name="initialPoolSize">3property>
 
    
    <property name="maxIdleTime">60property>
 
    
    <property name="maxPoolSize">15property>
 
    
    <property name="maxStatements">100property>
 
    
    <property name="maxStatementsPerConnection">property>
 
     
    <property name="numHelperThreads">3property>
 
     
    <property name="overrideDefaultUser">rootproperty>
 
    
    <property name="overrideDefaultPassword">passwordproperty>
 
     
    <property name="password">property>
 
    
    <property name="preferredTestQuery">select id from test where id=1property>
 
     
    <property name="propertyCycle">300property>
 
    
    <property name="testConnectionOnCheckout">falseproperty>
 
    
    <property name="testConnectionOnCheckin">trueproperty>
 
    
    <property name="user">rootproperty>
 
    
    <property name="usesTraditionalReflectiveProxies">falseproperty>

你可能感兴趣的:(Java,插件)