在Eclipse中测试MySQL-JDBC(13)Apache的DBCP连接池和c3p0连接池

来源:互联网 发布:js alert 编辑:程序博客网 时间:2024/05/29 12:52

【1 Apache DBCP连接池】

DBCP 是 Apache软件基金组织下的开源数据库连接池的实现,

使用DBCP 数据源,应用程序需要在系统中增加两个jar文件(jar版本自己找,此处暂不提供)

Commons-dbcp.jar: 连接池的实现

Commons-pool.jar: 连接池实现的依赖库



DBCP的使用方式,获取连接的方式类似jdbc:

1、  实例化对象

BasicDataSource bs = new BasicDataSource();

2、  加载数据库驱动

bs.setDriverClassName("com.mysql.jdbc.Driver");

3、  获取连接

bs.setUrl("jdbc:mysql:///jdbcDemo");【免安装板中解决中文乱码需要在后面加:?characterEncoding=utf-8】

4、  设置用户名

bs.setUsername("root");

5、  设置密码

bs.setPassword("root");

6、  获取连接

bs.getConnection();


【示例 使用DBCP连接池,创建DbcpTest.java】

package com.flying.jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.commons.dbcp.BasicDataSource;import org.junit.Test;public class DbcpTest {@Testpublic void DbcpTest() {//dbcp连接池的使用BasicDataSource bs = new BasicDataSource();bs.setDriverClassName("com.mysql.jdbc.Driver");bs.setUrl("jdbc:mysql:///jdbcdemo?characterEncoding=utf-8");bs.setUsername("root");bs.setPassword("root");Connection con=null;PreparedStatement pt =null;ResultSet res=null;try {//获取连接 con = bs.getConnection(); String sql="select * from account where name='a'"; pt = con.prepareStatement(sql); res = pt.executeQuery(); if (res.next()) {System.out.println(res.getString(1)+"="+res.getDouble(2));}} catch (SQLException e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, res);}}}




【 DbcpTest.java使用配置文件优化】

【创建 dbcp.properties】放在src下


driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///jdbcDemo?characterEncoding=utf-8

username=root

password=root


使用dbcp数据源工厂 创建dbcp数据源

【代码如下】

package com.flying.jdbc;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;import org.junit.Test;public class DbcpTest {//未用配置文件优化@Testpublic void DbcpTest() {//dbcp连接池的使用BasicDataSource bs = new BasicDataSource();bs.setDriverClassName("com.mysql.jdbc.Driver");bs.setUrl("jdbc:mysql:///jdbcdemo?characterEncoding=utf-8");bs.setUsername("root");bs.setPassword("root");Connection con=null;PreparedStatement pt =null;ResultSet res=null;try { con = bs.getConnection(); String sql="select * from account where name='a'"; pt = con.prepareStatement(sql); res = pt.executeQuery(); if (res.next()) {System.out.println(res.getString(1)+"="+res.getDouble(2));}} catch (SQLException e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, res);}}//下面使用配置文件方式优化上边的代码@Testpublic void DbcpTest2() {Connection con=null;PreparedStatement pt=null;ResultSet res=null;try {Properties properties = new Properties();//类加载器加载配置文件InputStream in = DbcpTest.class.getClassLoader().getResourceAsStream("dbcp.properties");properties.load(in);//dbcp连接池的使用DataSource ds = BasicDataSourceFactory.createDataSource(properties); con = ds.getConnection(); String sql="select * from account where name='b'"; pt = con.prepareStatement(sql);  res = pt.executeQuery();  if (res.next()) {System.out.println(res.getString(1)+":"+res.getDouble(2));}} catch (Exception e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, res);}}}



【  DBCP精华整理】


1、整理:

连接池:存储连接的集合。

需要实现 javax.sql.Datarouce 接口。

 

2、开源连接池:DBCP ,实现了javax.sql.DataSource接口

a、通过 getConnection()方法,从集合中获取连接

b、dbcp 提供实现类,需要告诉dbcp连接数据库的参数信息。

ds.setDriverClassName

ds.setUrl

ds.setUserName

ds.setPassword

 

3、可以通过配置文件的方式,配置数据库的连接参数。

dbcp要连接的参数信息放到properties文件中。

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/day08

username=root

password=root

 

把dpcp.properties 文件转成 properties对象

Properties props = new Properties();

InputStream in = 当前类.class.getClassLoader().getResourceAsStream(“配置文件”); //指的是src根目录下的配置文件

props.load(in);

//通过DBCP的连接池工厂来获取连接池

DataSource dataSource = BasicDataSourceFactory.createDataSource(props);

                   //获取连接

con = dataSource.getConnection();



【2 c3p0连接池的使用】

C3P0 是一个开源的JDBC连接池,目前他的开源项目有spring和hibernate等。

优点:高效、简洁、配置方便。

 

【示例:手动配置 C3p0Test.java

先导入C3P0的jar包(注意版本,不同的版本有不同的依赖别的jar包的情况)


package com.flying.datesource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import org.junit.Test;import com.flying.jdbc.JdbcUtils;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3p0Test {@Testpublic void testC3p0() {//c3p0连接Connection con =null;PreparedStatement pt=null;ResultSet res=null;try {ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass("com.mysql.jdbc.Driver");cpds.setJdbcUrl("jdbc:mysql:///jdbcdemo");cpds.setUser("root");cpds.setPassword("root");con = cpds.getConnection();String sql = "select * from account where name='b'";pt = con.prepareStatement(sql);res = pt.executeQuery();if (res.next()) {System.out.println(res.getString(1)+":"+res.getDouble(2));}} catch (Exception e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, res);}}}


【 使用配置文件优化代码】

C3P0 要求我们把xml文件 放到src目录下,并且名字是c3p0-config.xml

C3P0 自己去找这个文件,并且读取文件中信息


【c3p0-config.xml】


<c3p0-config>

<!-- c3p0默认的连接配置 -->

  <default-config>

    <propertyname="driverClass">com.mysql.jdbc.Driver</property>

    <propertyname="jdbcUrl">jdbc:mysql:///jdbcdemo?characterEncoding=utf-8</property>

    <propertyname="user">root</property>

    <propertyname="password">root</property>

  </default-config>

<!-- 用户自定义连接配置 -->

  <named-configname="intergalactoApp">

  </named-config>

</c3p0-config>



【新代码如下】

package com.flying.datesource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import org.junit.Test;import com.flying.jdbc.JdbcUtils;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3p0Test {//没有使用配置文件的方法@Testpublic void testC3p0() {//c3p0连接Connection con =null;PreparedStatement pt=null;ResultSet res=null;try {ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass("com.mysql.jdbc.Driver");cpds.setJdbcUrl("jdbc:mysql:///jdbcdemo");cpds.setUser("root");cpds.setPassword("root");con = cpds.getConnection();String sql = "select * from account where name='b'";pt = con.prepareStatement(sql);res = pt.executeQuery();if (res.next()) {System.out.println(res.getString(1)+":"+res.getDouble(2));}} catch (Exception e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, res);}}//下面使用配置文件c3p0-config.xml@Testpublic void testC3p02() {Connection con=null;PreparedStatement pt=null;ResultSet rt =null;try {ComboPooledDataSource cpds = new ComboPooledDataSource();con = cpds.getConnection();String sql="select * from account where name='a'"; pt = con.prepareStatement(sql); rt = pt.executeQuery(); if (rt.next()) {System.out.println(rt.getString(1)+"-"+rt.getDouble(2));}} catch (Exception e) {e.printStackTrace();}finally{JdbcUtils.release(con, pt, rt);}}}





原创粉丝点击