数据库连接池

数据库连接池

数据库连接 -- 执行完毕 -- 释放

连接 -- 释放 十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

最小连接数:10

最大连接数:15

等待超时:100ms

编写连接池,实现一个接口DataSource(所有的数据源都要实现这个接口)

开源数据源实现

DBCP

C3P0

Druid:阿里巴巴

使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了。

DBCP

需要用到的jar包

commons-dbcp-1.4、commons-pool-1.6

dbcpconfig.properties:

#连接设置	这里面的名字是dbcp数据源中已经定义好的
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 等待这么长时间没有用到空闲的连接然后释放掉空闲的连接-->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:“user” 与 “password” 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

数据库连接工具类:JdbcUtils_DBCP.java:

public class JdbcUtils_DBCP{
    private static DataSource dataSource = null;
    
    static{
        try{
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);
            //创建数据源 工厂模式 ---> 创建
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //获取连接
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();	//从数据源中获取连接
    }
    
    //释放连接资源
    public static void release(Connection conn,Statement st,ResultSet rs){
        if (rs != null){
            try{
                rs.close();
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (st != null){
            try{
                st.close();
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (conn != null){
            try{
                conn.close();
            } catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
}

测试DBCP数据源,TestDBCP.java:

public class TestDBCP{
    public static void main(String[] args){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        
        try{
            conn = JdbcUtils_DBCP.getConnection();	//获取数据库连接
            //使用?占位符代替参数
            String sql = "INSERT INTO users(id,'NAME','PASSWORD','email','birthday') VALUES(?,?,?,?,?)";
            
            st = conn.prepareStatement(sql);	//预编译SQL,先写SQL,然后不执行
            
            //手动给参数赋值
            st.setInt(1,3);
            st.setString(2,"ban");
            st.setString(3,"123456");
            st.setString(4,"165545@qq.com");
            //注意点:sql.Date	数据库	java.sql.Date()
            //		util.Date  java  new Date().getTime() 获得时间戳
            st.setDate(5,new java.sql.Date(new Date().getTime()));
            
            //执行
            int i = st.executeUpdate();
            if (i>0) {
                System.out.println("插入成功!");
            }
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JdbcUtils_DBCP.release(conn,st,rs);
        }
    }
}

C3P0

需要用到的jar包

c3p0-0.9.5.5.jar、mchange-commons-java-0.2.19.jar


代码配置版:

c3p0 was designed to be butt-simple to use. Just put the files lib/c3p0-0.9.5.5.jar and lib/mchange-commons-java-0.2.19.jar in your application's effective CLASSPATH, then make a DataSource like this:

import com.mchange.v2.c3p0.*;
	
...
	
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver            
cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
cpds.setUser("dbuser");                                  
cpds.setPassword("dbpassword");  
cpds.setMaxStatements( 180 );

C3P0数据源连接工具类,JdbcUtils_C3P0,代码配置版:

public class JdbcUtils_C3P0{
    private static CombopooledDataSource cpds = null;
    
    static{
        try{
            cpds = new ComboPooledDataSource();
            cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver       
            cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
            cpds.setUser("dbuser");                                  
            cpds.setPassword("dbpassword");  
            cpds.setMaxStatements( 180 );
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //获取连接
    public static Connection getConnection() throws SQLException{
        return cpds.getConnection();	//从数据源中获取连接
    }
    
    //释放连接资源
    public static void release(){
        cpds.close();
    }
}

测试数据源,TestC3P0.java:

public class TestC3P0{
    public static void main(String[] args){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        
        try{
            conn = JdbcUtils_C3P0.getConnection();	//获取数据库连接
            //使用?占位符代替参数
            String sql = "INSERT INTO users(id,'NAME','PASSWORD','email','birthday') VALUES(?,?,?,?,?)";
            
            st = conn.prepareStatement(sql);	//预编译SQL,先写SQL,然后不执行
            
            //手动给参数赋值
            st.setInt(1,3);
            st.setString(2,"ban");
            st.setString(3,"123456");
            st.setString(4,"165545@qq.com");
            //注意点:sql.Date	数据库	java.sql.Date()
            //		util.Date  java  new Date().getTime() 获得时间戳
            st.setDate(5,new java.sql.Date(new Date().getTime()));
            
            //执行
            int i = st.executeUpdate();
            if (i>0) {
                System.out.println("插入成功!");
            }
        } catch (SQLException e){
            e.printStackTrace();
        } finally {
            JdbcUtils_C3P0.release(conn,st,rs);
        }
    }
}

XML配置版:

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://localhost:3306/jdbc</property>
    <property name="user">root</property>
    <property name="password">java</property>
 
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </default-config>
 
  <named-config name="MySQL">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
    <property name="user">root</property>
    <property name="password">xxxx</property>
 
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </named-config>
    
  <named-config name="Oracle">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
    <property name="user">root</property>
    <property name="password">xxxx</property>
 
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </named-config>
</c3p0-config>

DataSource ds = new ComboPooledDataSource(" MySQL");//参数对应使用哪个config,如果不写,表示使用默认的config,即default-config里的配置,否则使用参数指定的named-config里的配置。

C3P0数据源连接工具类,JdbcUtils_C3P0,XML配置版:

public class JdbcUtils_C3P0{
    private static CombopooledDataSource cpds = null;
    
    static{
        try{
            cpds = new ComboPooledDataSource("MySQL");
        } catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //获取连接
    public static Connection getConnection() throws SQLException{
        return cpds.getConnection();	//从数据源中获取连接
    }
    
    //释放连接资源
    public static void release(){
        cpds.close();
    }
}

测试数据源同上。

结论

无论使用什么数据源,本质还是一样的,这些数据源都要实现DataSource接口,DataSource接口不变,方法不会变。

posted @ 2021-08-01 12:11  有我的担忧  阅读(64)  评论(0编辑  收藏  举报