• 开源的连接池技术DBCP和C3P0


    概述:

             Sun公司约定: 如果是连接池技术,需要实现一个接口!

             javax.sql.DataSource;

         相关jar包和资料下载

    1.1  DBCP连接池:

    l  DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

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

    l  Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

    l  核心类:BasicDataSource

    l  使用步骤

    • 引入jar文件

    l  commons-dbcp-1.4.jar

    l  commons-pool-1.5.6.jar

    示例代码

    首先创建数据库的配置信息db.properties

    url=jdbc:sqlserver://localhost:1433;DataBaseName=Test
    username=sa
    password=123456
    driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
    initialSize=3
    maxActive=6
    maxIdle=3000
    

     开始编写测试类

    package com.gqx.DBCP;
    
    import static org.junit.Assert.*;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    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;
    import com.jdbc.util.JDBCUtil;
    
    public class DBCPTest {
    
    	@Test
    	public void test() {
    		//硬编码
    		//DBCP连接池核心类
    		BasicDataSource dataSource =new BasicDataSource();
    		//连接池参数配置,初始化连接,最大连接数/连接字符串,驱动,账号密密码
    		dataSource.setUrl("jdbc:sqlserver://localhost:1433;DataBaseName=Test");
    		dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    		dataSource.setUsername("sa");
    		dataSource.setPassword("123456");
    		dataSource.setInitialSize(3);		//初始化链接数目
    		dataSource.setMaxActive(6);	//最大连接数目
    		dataSource.setMaxIdle(3000);		//设置最大空闲时间
    		
    		//获取连接
    		Connection connection=null;
    		PreparedStatement statement=null;
    		try {
    				connection=dataSource.getConnection();
    			String sql="insert into usershop values(?,?,?) ";
    			statement=connection.prepareStatement(sql);
    			statement.setInt(1, 2);
    			statement.setInt(2, 2);
    			statement.setInt(3, 4);
    			statement.executeUpdate();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			JDBCUtil.close(connection, statement);
    		}
    	}
    	
    	//根据配置文件获取连接
    	@Test
    	public void test2() throws Exception{
    		//加载properties加载配置文件
    		Properties prop=new Properties();	
    		/**
    		 * 类路径
    		 *  . 代表java命令运行的目录
    		 *  在java项目下,. java命令的运行目录从项目的根目录开始
    		 *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
    		 *  所以不能使用点.
    		 */
    		InputStream in = DBCPTest.class.getResourceAsStream("db.properties");
    		prop.load(in);
    		//根据properties配置直接创建数据对象
    		DataSource dataSource=BasicDataSourceFactory.createDataSource(prop);
    		
    		//获取连接
    				Connection connection=null;
    				PreparedStatement statement=null;
    				try {
    					connection=dataSource.getConnection();
    					String sql="insert into usershop values(?,?,?) ";
    					statement=connection.prepareStatement(sql);
    					statement.setInt(1, 6);
    					statement.setInt(2, 3);
    					statement.setInt(3, 4);
    					statement.executeUpdate();
    				} catch (SQLException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}finally{
    					JDBCUtil.close(connection, statement);
    				}
    		
    	}
    
    }
    

      


    1.1  C3P0连接池:

    C3P0连接池:

             最常用的连接池技术!Spring框架,默认支持C3P0连接池技术!

    C3P0连接池,核心类:

             CombopooledDataSource ds;

    使用:

    1. 下载,引入jar文件:  c3p0-0.9.1.2.jar
    2. 使用连接池,创建连接

    代码示例

    注意要按照c3p0的标准写一个xml文件(在c3p0的jar包的源代码文件中有实例),如我的xml配置文件,名称为“c3p0-config.xml”,这是规定,在使用其核心类的时候,它会自动加载src下名为c3p0-config.xml的文件

    <c3p0-config>
      <default-config>
        <property name="jdbcUrl">jdbc:sqlserver://localhost:1433;DataBaseName=教学库</property> 
        <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="user">sa</property>
        <property name="password">123456</property>
        <property name="maxIdleTime">3000</property>
        <property name="maxPoolSize">6</property>
        <property name="initialPoolSize">3</property>
      </default-config>
    
    
      <named-config name="mysqlConfig">
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo
    		</property>
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="user">root</property>
    		<property name="password">root</property>
    		<property name="initialPoolSize">3</property>
    		<property name="maxPoolSize">6</property>
    		<property name="maxIdleTime">1000</property>
       </named-config>
    </c3p0-config>
    

    再是测试类了

    package com.gqx.C3P0;
    
    import static org.junit.Assert.*;
    
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import org.junit.Test;
    
    import com.jdbc.util.JDBCUtil;
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0Demo {
    	//硬编码方式使用c3p0
    	@Test
    	public void test() throws Exception {
    		//创建连接池核心工具类
    		ComboPooledDataSource dataSource=new ComboPooledDataSource();
    		//设置连接处参数
    		dataSource.setJdbcUrl("jdbc:sqlserver://localhost:1433;DataBaseName=Test");
    		dataSource.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    		dataSource.setUser("sa");
    		dataSource.setPassword("123456");
    		dataSource.setInitialPoolSize(3);
    		dataSource.setMaxPoolSize(6);
    		dataSource.setMaxIdleTime(3000);
    		
    		//从连接池对象中获取连接
    		Connection connection=null;
    		PreparedStatement statement=null;
    		try {
    			connection=dataSource.getConnection();
    			String sql="insert into usershop values(?,?,?) ";
    			statement=connection.prepareStatement(sql);
    			statement.setInt(1, 6);
    			statement.setInt(2, 4);
    			statement.setInt(3, 4);
    			statement.executeUpdate();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			JDBCUtil.close(connection, statement);
    		}
    		
    	}
    	
    	
    	//根据配置文件获取连接
    		@Test
    		public void test2() throws Exception{
    			//创建连接池核心工具类 
    			//自动加载src下叫做c3p0-config.xml的配置文件中的default-config
    			/**
    			 * ComboPooledDataSource(config name)当要换数据库的时候(不适用默认数据库)
    			 * 可以以字符串的形式输入在c3p0-config.xml中<named-config name="mysqlConfig">指定的参数
    			 */
    			ComboPooledDataSource dataSource=new ComboPooledDataSource();
    			
    			
    			//从连接池对象中获取连接
    			Connection connection=null;
    			PreparedStatement statement=null;
    			try {
    				connection=dataSource.getConnection();
    				String sql="insert into usershop values(?,?,?) ";
    				statement=connection.prepareStatement(sql);
    				statement.setInt(1, 2);
    				statement.setInt(2, 3);
    				statement.setInt(3, 4);
    				statement.executeUpdate();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}finally{
    				JDBCUtil.close(connection, statement);
    			}
    		}
    		
    
    }
    

     由此,我可以把原来的JDBCUtil包重新改写一下,换成常用的c3p0技术,如下

    package com.jdbc.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import javax.activation.DataSource;
    
    import org.omg.CORBA.portable.InputStream;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCUtil {
    
    	//初始化连接池
    	private static  ComboPooledDataSource dataSource;
    	/*
    	 * 静态代码块只加载一次
    	 */
    	static{
    		dataSource=new ComboPooledDataSource();
    	}
    	
    	/**
    	 * 获取JDBC连接对象的方法
    	 */
    	public static Connection getConnection(){
    		try {
    			return dataSource.getConnection();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			throw new RuntimeException(e);
    		}
    	}
    	
    	/*
    	 * 关闭操作
    	 */
    	
    	public static void close(Connection con,Statement stmt){
    			if (stmt!=null) {
    				try {
    					stmt.close();
    				} catch (SQLException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    					throw new RuntimeException(e);
    				}
    			}
    			if (con!=null) {
    				try {
    					con.close();
    				} catch (SQLException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    					throw new RuntimeException(e);
    				}
    			}
    		}
    	
    	/**
    	 * 这是方法的重载
    	 * @param con
    	 * @param stmt
    	 * @param resultSet
    	 */
    public static void close(Connection con,Statement stmt,ResultSet resultSet){
    	if (resultSet!=null) {
    		try {
    			resultSet.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    		if (stmt!=null) {
    			try {
    				stmt.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    				throw new RuntimeException(e);
    			}
    		}
    		if (con!=null) {
    			try {
    				con.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    				throw new RuntimeException(e);
    			}
    		}
    	}
    }
    

    还有就是网上说:dbcp没有自动的去回收空闲连接的功能,而c3p0有自动回收空闲连接功能。
    一般c3p0使用的比较多

  • 相关阅读:
    小、快、简、易、强的“银弹”— fastm
    使用Creative suite 3和Flex Builder3实现Flex 3的换肤
    Apache HTTP Server 与 Tomcat 的三种连接方式介绍
    iframe自动适应付窗口的大小变换
    Flash网络游戏开发入门经验共享
    比较详细的 Linux Top 命令解析
    HttpContext是干什么的
    asp.net,cookie,写cookie,取cookie 的方法
    为什么我们不要 .NET 程序员
    在Ubuntu上安装使用深度影音&深度音乐(推荐)
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6082462.html
Copyright © 2020-2023  润新知