zoukankan      html  css  js  c++  java
  • 数据连接池详解

    简述

      数据库连接池本质就是一个容器,存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后会将连接对象归还给容器。使用数据库连接池会节省资源,用户访问也会更加高效。在javax.sql包下有一个DataSource接口哦,各厂商可以实现该接口提供各自的数据库连接池。常用的数据库连接池有C3P0和Druid,顺便一提C3P0名字的由来是星球大战的一个机器人的名字,Druid德鲁伊数据库连接池是由阿里提供的,号称是世界上最好的连接池。

    C3P0详解

      使用C3P0之前必须导入它的jar包,或者在maven中添加c3p0的依赖

    <dependency>
       <groupId>com.mchange</groupId>
       <artifactId>c3p0</artifactId>
       <version>0.9.5.2</version>
    </dependency>    

      若手动导入jar包,我们必须导入c3p0-xxx.jar 和mchange-common-java-xxx.jar两个jar包

      然后我们必须定义数据库连接池的配置文件,我们必须在classpath路径下定义配置文件c3p0.properties或者c3p0-config.xml

    <c3p0-config>
        <default-config>
    
            <!--连接参数-->
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    
            <!--连接池参数-->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">10</property>
            <property name="checkoutTimeout">3000</property>
    
        </default-config>
    
        <named-config name="otherc3p0">
            <!--连接参数-->
            <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
            <property name="user">root</property>
            <property name="password">123456</property>
    
            <!--连接池参数-->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">8</property>
            <property name="checkoutTimeout">3000</property>
        </named-config>
    </c3p0-config>
    简单的配置文件

      连接池就是用来获取连接的,所以我们可以创建连接池对象,然后从连接池对象处获取连接

    public static void main(String[] args) throws Exception{
            //1.创建数据库连接池对象
            DataSource ds = new ComboPooledDataSource();
            //2.获取连接对象
            Connection connection = ds.getConnection();
    }

      需要注意的是,使用连接池获取的连接close会归还连接到连接池中。

      在ComboPooledDataSource()中可以写一个string参数,可以选择xml配置的不同连接配置

    Druid详解

      使用德鲁伊连接池也需要导入jar包,druid-xxx.jar

      然后需要在类路径新建任意名称的properties或xml

    driverClassName = com.mysql.cj.jdbc.Driver
    url = jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
    username = root
    password = 123456
    
    initialSize = 5
    maxActive = 10
    maxWait = 3000

      德鲁伊数据库连接池是通过一个工厂类来获取的,然后获取到连接池后才可以获取连接

    public static void main(String[] args) throws Exception{
                //1.加载配置文件
                Properties properties = new Properties();
                InputStream is = demo.class.getClassLoader().getResourceAsStream("druid.properties");
                properties.load(is);
                //2.获取连接池对象
                DataSource ds = DruidDataSourceFactory.createDataSource(properties);
                //3.获取连接
                Connection connection = ds.getConnection();
                System.out.println(connection);
    }

      使用连接池一般我们会搭配自己写的数据库工具类来使用

    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class JDBCUtils {
        private static DataSource ds;
    
        static {//使用静态代码块完成DataSource的赋值操作
            try {
                Properties pro = new Properties();
                pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                ds = DruidDataSourceFactory.createDataSource(pro);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static Connection getConnection() throws SQLException{
            return ds.getConnection();
        }
    
        public static void close(Statement stmt,Connection conn){
            close(null,stmt,conn);
        }
    
        public static void close(ResultSet resultSet,Statement stmt, Connection conn){
            try {
                if(stmt!=null){
                    stmt.close();
                }
                if(conn!=null){
                    conn.close();
                }
                if(resultSet!=null){
                    resultSet.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        public static DataSource getDataSource(){
            return ds;
        }
    
    }
    配合连接池的工具类

      

      

     

     

     

    一点一点积累,一点一点蜕变!
  • 相关阅读:
    C 标准库
    C 标准库
    C 标准库
    C 标准库
    Chrome内核保存为mhtml(单网页)
    C 标准库
    C 标准库
    【转】AOP
    [转]控制反转与依赖注入模式
    [转]乐观锁、悲观锁、死锁的区别
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/14758136.html
Copyright © 2011-2022 走看看