zoukankan      html  css  js  c++  java
  • 9 数据库连接池

    数据库连接池

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

    连接——释放 很浪费资源

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

    最小连接数:10

    最大连接数:15

    等待超时:100ms

    编写连接池:实现一个接口 DataSource

    开源数据源实现(拿来即用)

    DBCP

    C3P0

    Druid:阿里巴巴

    使用了这些数据库连接池之后,我们在项目开发中就不需要写连接数据库的代码(即conn = JdbcUtil.getConnection();)

    DBCP

    导入jar包(记得添加到路径)

    commons-dbcp-1.4.jar

    commons-pool-1.6.jar

    配置文件dbcpconfig.properties

    #连接设置
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
    username=root
    password=123456
    
    #<!-- 初始化连接 -->
    initialSize=10
    
    #最大连接数量
    maxActive=50
    
    #<!-- 最大空闲连接 -->
    maxIdle=20
    
    #<!-- 最小空闲连接 -->
    minIdle=5
    
    #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
    maxWait=60000
    #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
    #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
    connectionProperties=useUnicode=true;characterEncoding=UTF8
    
    #指定由连接池所创建的连接的自动提交(auto-commit)状态。
    defaultAutoCommit=true
    
    #driver default 指定由连接池所创建的连接的只读(read-only)状态。
    #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
    defaultReadOnly=
    
    #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
    #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
    defaultTransactionIsolation=READ_UNCOMMITTED
    

    工具类

    package cn.dj.www.lesson05;
    
    import org.apache.commons.dbcp.BasicDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class JdbcUtil_DBCP {
        private static DataSource dataSource = null;
        static{
            try{
                //./ 表示上一级目录
                InputStream inputStream = JdbcUtil_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
                Properties properties = new Properties();
                properties.load(inputStream);
    
                //创建数据源 工厂模式
                dataSource = BasicDataSourceFactory.createDataSource(properties);
    
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //获取连接
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
        //释放连接
        public static void release(Connection connection, Statement statement, ResultSet resultSet)  {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    测试

    package cn.dj.www.lesson05;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Date;
    
    public class Test {
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement pst =null;
            try {
                conn  = JdbcUtil_DBCP.getConnection();
                String sql = "insert into users(id,`name`,`password`,`email`,`birthday`)"+
                        "values(?,?,?,?,?)";
                pst = conn.prepareStatement(sql);//预编译
                //传递参数
                pst.setInt(1,5);
                pst.setString(2,"DJ");
                pst.setString(3,"123456");
                pst.setString(4,"123@163.com");
                // java Date().getTime() 获得时间戳
                pst.setDate(5, new java.sql.Date(new Date().getTime()));
    
                int i = pst.executeUpdate();
                if(i>0){
                    System.out.println("插入成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                JdbcUtil_DBCP.release(conn,pst,null);
            }
    
        }
    }
    

    C3P0

    两个jar

    c3p0-0.9.5.5.jar

    mchange-commons-java-0.2.19.jar

    配置文件 c3p0-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    <!--
    c3p0的缺省(默认)配置
    如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)-->
        <default-config>
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    
            <property name="acquiredIncrement">5</property>
            <property name="initialPoolSize">10</property>
            <property name="minPoolSize">5</property>
            <property name="maxPoolSize">20</property>
        </default-config>
    <!--
    c3p0的命名配置
    如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("MySQL");"这样写就表示使用的是mysql的缺省(默认)-->
            <named-config name="MySQL">
                <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
                <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=true&amp;serverTimezone=UTC</property>
                <property name="user">root</property>
                <property name="password">123456</property>
    
                <property name="acquiredIncrement">5</property>
                <property name="initialPoolSize">10</property>
                <property name="minPoolSize">5</property>
                <property name="maxPoolSize">20</property>
            </named-config>
    </c3p0-config>
    

    工具类 JdbcUtil_C3P0

    package cn.dj.www.lesson05;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.apache.commons.dbcp.BasicDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class JdbcUtil_C3P0 {
        private static DataSource dataSource = null;
        static{
            try{
                //xml 不用读,自动匹配
                //创建数据源 工厂模式
                dataSource = new ComboPooledDataSource("MySQL");//配置文件写法
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //获取连接
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
        //释放连接
        public static void release(Connection connection, Statement statement, ResultSet resultSet)  {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    测试

    package cn.dj.www.lesson05;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Date;
    
    public class Test {
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement pst =null;
            try {
                conn  = JdbcUtil_C3P0.getConnection();
                String sql = "insert into users(id,`name`,`password`,`email`,`birthday`)"+
                        "values(?,?,?,?,?)";
                pst = conn.prepareStatement(sql);//预编译
                //传递参数
                pst.setInt(1,6);
                pst.setString(2,"DJ");
                pst.setString(3,"123456");
                pst.setString(4,"123@163.com");
                // java Date().getTime() 获得时间戳
                pst.setDate(5, new java.sql.Date(new Date().getTime()));
    
                int i = pst.executeUpdate();
                if(i>0){
                    System.out.println("插入成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                JdbcUtil_C3P0.release(conn,pst,null);
            }
    
        }
    }
    

    结论

    无论使用什么数据源,本质还是一样的,DataSource的接口还是不会变的

  • 相关阅读:
    查windows系统开关机记录
    HDU-6278-Jsut$h$-index(主席树)
    POJ-2104-Kth Number(主席树)
    HDU-6546-Function(贪心)
    POJ-1523-SPF(求割点)
    POJ-2762-Going from u to v or from v to u(强连通, 拓扑排序)
    POJ-2552-The Bottom of a Graph 强连通分量
    POJ-1659-Frogs' Neighborhood
    POJ-1904-King‘s Quest
    POJ-1236-Network of Schools
  • 原文地址:https://www.cnblogs.com/10134dz/p/13151202.html
Copyright © 2011-2022 走看看