《JDBC》_C3P0

《JDBC》_C3P0

1.数据库连接池

  • 连接池是创建和管理连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

  • 应用程序直接获取连接的缺点:用户每次请求都需要向数据库获得连接,而数据库创建连接需要消耗较大的资源、较长的时间。假设网站一天十万访问量,数据库服务器就要创建10万次连接,极大的浪费数据库的资源,并且容易造成数据库服务器内存溢出。

  • 而采用连接池技术,用户可以直接使用连接池中已创建好的连接,与数据库通信。

2.C3P0的使用

C3P0是一个开源的JDBC连接池

  • c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
	<property name="user">root</property>
	<property name="password">abc</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
  </default-config>
  
</c3p0-config>
  • JDBCUtils.java

    package com.imooc.jdbc.utils;
    
    import java.io.IOException;
    import java.io.InputStream;
    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 com.mchange.v2.c3p0.ComboPooledDataSource;
    
    /**
     * JDBC的工具类
     * @author jt
     *
     */
    public class JDBCUtils2 {
    	private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
    	
    	/**
    	 * 获得连接的方法:
    	 * @throws SQLException 
    	 */
    	public static Connection getConnection() throws Exception{
    		Connection conn = dataSource.getConnection();
    		return conn;
    	}
    	
    	/**
    	 * 资源释放
    	 */
    	public static void release(Statement stmt,Connection conn){
    		if(stmt != null){
    			try {
    				stmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			stmt = null;
    		}
    		if(conn != null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			conn = null;
    		}
    	}
    	
    	public static void release(ResultSet rs,Statement stmt,Connection conn){
    		if(rs!= null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			rs = null;
    		}
    		if(stmt != null){
    			try {
    				stmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			stmt = null;
    		}
    		if(conn != null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			conn = null;
    		}
    	}
    }
    
    
  • DataSourceDemo1.java

    package com.imooc.jdbc.demo3;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import org.junit.Test;
    
    import com.imooc.jdbc.utils.JDBCUtils;
    import com.imooc.jdbc.utils.JDBCUtils2;
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    /**
     * 连接池的测试类
     * @author jt
     *
     */
    public class DataSourceDemo1 {
    	@Test
    	/**
    	 * 使用配置文件的方式
    	 */
    	public void demo2(){
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try{
    			/*// 获得连接:
    			ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
    			// 获得连接:
    			// conn = dataSource.getConnection();
    			conn = JDBCUtils2.getConnection();
    			// 编写Sql:
    			String sql = "select * from user";
    			// 预编译SQL:
    			pstmt = conn.prepareStatement(sql);
    			// 设置参数
    			// 执行SQL:
    			rs = pstmt.executeQuery();
    			while(rs.next()){
    				System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			JDBCUtils2.release(rs, pstmt, conn);
    		}
    	}
    
    	@Test
    	/**
    	 * 手动设置连接池
    	 */
    	public void demo1(){
    
    		// 获得连接:
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		try{
    			// 创建连接池:
    			ComboPooledDataSource dataSource = new ComboPooledDataSource();
    			// 设置连接池的参数:
    			dataSource.setDriverClass("com.mysql.jdbc.Driver");
    			dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
    			dataSource.setUser("root");
    			dataSource.setPassword("abc");
    			dataSource.setMaxPoolSize(20);
    			dataSource.setInitialPoolSize(3);
    			
    			// 获得连接:
    			conn = dataSource.getConnection();
    			// 编写Sql:
    			String sql = "select * from user";
    			// 预编译SQL:
    			pstmt = conn.prepareStatement(sql);
    			// 设置参数
    			// 执行SQL:
    			rs = pstmt.executeQuery();
    			while(rs.next()){
    				System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			JDBCUtils.release(rs, pstmt, conn);
    		}
    	}
    }
    
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值