首先简单了解一下JDBC和c3p0
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
在JDBC项目中,如果需要多个连接,如果一直获取连接再断开连接,会造成资源的极大浪费和占用。而在c3p0项目中,c3p0它有一个数据库池是用来管理客户端和数据库连接(Connection),有了这个池我们就不用自己来创建Connection,也不用担心频繁的连接断开操作造成的系统资源浪费很大,通过池来获取Connection对象,当使用完后,进行的资源释放c3po_utils.release(rs,conn,pstm)并不是直接把进程直接关掉,而是把从连接池占用的资源又还回去给池。
配置c3p0
首先
下载官网c3p0:https://sourceforge.net/projects/c3p0/
打开下载好的c3p0文件夹下的lib目录,可以看到c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar两个jar包
这里以IDEA为例
第二步,成功导入包后,我们配置一下c3p0的配置文件,c3p0不在properties文件中配置,而是在xml中配置
在src下新建c3p0_config.xml文件
在新建好的c3p0_config.xml中加入配置
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config>
//以下是数据库用户名、密码、被操作的数据表名地址、驱动类 <property name="user">root</property> <property name="password">root</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/users</property> <property name="driverClass">com.mysql.jdbc.Driver</property> //最大连接数、最小连接数、一次增长个数、初始可连接数 <property name="maxPoolSize">100</property> <property name="minPoolSize">2</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">3</property> //最大等待连接时间、空闲连接测试个数、最大空闲时间、最大预缓存数 <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="maxIdleTime">30</property> <property name="maxStatements">200</property> </default-config> <!-- 命名的配置,可以通过方法调用实现 --> <named-config name="Mysql"> <property name="user">root</property> <property name="password">root</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncodeing=utf8&useSSL=true</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <!-- 初始化数据库连接池时连接的数量 --> <property name="initialPoolSize">20</property> <!-- 数据库连接池中的最大的数据库连接数 --> <property name="maxPoolSize">25</property> <!-- 数据库连接池中的最小的数据库连接数 --> <property name="minPoolSize">5</property> </named-config> </c3p0-config>
编写c3p0工具类utils
package com.lsq.Utils_Study.Utils; import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class c3p0_Utils { public static DataSource dataSource = null; static { try { //创建数据源工厂模式 dataSource = new ComboPooledDataSource("Mysql");//配置文件写法 }catch (Exception e){ e.printStackTrace(); } } //获取连接 public static Connection getConnection() throws SQLException{ return dataSource.getConnection();//从数据源中获取连接 } //释放系统资源 public static void release(ResultSet rs, Connection conn, PreparedStatement pstm){ if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstm!=null){ try { pstm.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
测试c3p0连接是否成功
package com.lsq; import com.lsq.Utils_Study.Utils.c3p0_Utils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class c3p0_test { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; try { conn = c3p0_Utils.getConnection(); String sql = "select * from users where id=?"; pstm = conn.prepareStatement(sql); pstm.setInt(1,1); rs = pstm.executeQuery(); if (rs.next()){ System.out.println("查询成功"); System.out.println(rs.getString("NAME")); } } catch (SQLException e) { e.printStackTrace(); }finally { c3p0_Utils.release(rs,conn,pstm); } } }