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

    数据库连接池

    概念:其实就是一个容器(集合),存放数据库连接的容器。

    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

    好处:

    1. 节约资源
    2. 用户访问高效

    实现:

    1. 标准接口:DataSource java.sql包下的
      • 方法:
        • 获取连接:getConnection()
        • 归还连接:如果连接对象Connection是从连接池冲获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接。
    2. 一般我们不去实现它,有数据库厂商来实现。
      • C3P0:数据库连接池技术
      • Druid:数据库连接池的实现技术,由阿里巴巴提供的。

    C3P0:数据库连接池

    步骤:

    1. 导入jar包
    2. 定义配置文件
      • 名称:c3p0.properties 或者 c3p0-config.xml
      • 路径:直接将文件放在src目录下即可。
    3. 创建核心对象,数据库连接池对象
    package c3p0;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    /**
     * c3p0的演示
     */
    public class Demo01 {
        public static void main(String[] args) throws SQLException {
            //创建数据库连接池对象
            DataSource ds = new ComboPooledDataSource();
            //获取连接对象
            Connection conn = ds.getConnection();
            //打印
            System.out.println(conn);
        }
    }
    

    C3P0配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<default-config>
    		//注册驱动
    		<property name="driverClass"> 
    			com.mysql.jdbc.Driver
    		</property>
    		//数据库地址
    		<property name="jdbcUrl">
    			jdbc:mysql:///db1
    		</property>
    		//数据库用户名
    		<property name="user">
    			root1
    		</property>
    		//数据库密码
    		<property name="password">
    			password
    		</property>
    		//连接池数量
    		<property name="initialPoolSize">
    			5
    		</property>
    		//最大连接数
    		<property name="maxPoolSize">
    			10
    		</property>
    		//超时时间
    		<property name="checkoutTimeout">
    			3000
    		</property>
    	</default-config>
    </c3p0-config>
    
    

    Druid:数据库连接池

    步骤:

    1. 导入jar包

    2. 定义配置文件:

      • 是properties格式的
      • 可以叫任意名称,可以放在任意目录下
      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql:///db1
      username=root1
      password=password
      //初始化的连接数量
      initiaSize=5
      //最大连接数
      maxActive=10
      //最大等待时间
      maxWait=3000
      
    3. 加载配置文件

      Properties pro = new Properties();
              InputStream is = druid.Demo01.class.getClassLoader().getResourceAsStream("druid.properties");
              pro.load(is);
      
    4. 获取数据库连接池对象:通过工厂类来获取

    5. 获取连接

    package druid;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.util.Properties;
    
    /**
     * Druid演示
     */
    
    public class Demo01 {
        public static void main(String[] args) throws Exception {
            //加在配置文件
            Properties pro = new Properties();
            InputStream is = druid.Demo01.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            //获取连接池对象
            DataSource ds = DruidDataSourceFactory.createDataSource(pro);
            //获取连接
            Connection conn = ds.getConnection();
            System.out.println(conn);
        }
    }
    

    定义druid工具类

    1. 定义一个类 JDBCUtils
    2. 提供静态代码块加在配置文件,初始化连接池对象
    3. 提供方法
      1. 获取连接方法:通过数据库连接池获取连接
      2. 释放资源
      3. 获取连接池的方法
    package druidutils;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;
    
    /**
     * Druid连接池的工具类
     */
    public class JDBCUtils {
        //定义成员变量 DataSource
        private static DataSource ds;
    
        static {
            try {
                //加载配置文件
                Properties pro = new Properties();
                pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                //获取DataSource
                ds = DruidDataSourceFactory.createDataSource(pro);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接池
         * @return
         * @throws SQLException
         */
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    
        /**
         * 释放资源
         * @param pstmt
         * @param conn
         */
        public static void close(PreparedStatement pstmt, Connection conn){
    //        if (rs != null) {
    //            try {
    //                rs.close();
    //            } catch (SQLException throwables) {
    //                throwables.printStackTrace();
    //            }
    //        }
            if (pstmt != null){
                try {
                    pstmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close(); //归还连接
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    
        //获取连接池方法
        public static DataSource getDataSource(){
            return ds;
        }
    
    }
    

    练习:验证druid工具类

    package druid;
    
    import druidutils.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /*
    使用druid工具类
     */
    public class Demo02 {
        public static void main(String[] args) {
            //给表中添加一条记录
            Connection conn = null;
            PreparedStatement pstmt = null;
            try {
                //获取连接
                conn = JDBCUtils.getConnection();
                //定义sql
                String sql = "insert into user values(3,?,?)";
                //获取pstemt对象
                pstmt = conn.prepareStatement(sql);
                //给?赋值
                pstmt.setString(1,"xiaohong");
                pstmt.setString(2,"30000");
                //执行sql
                int count = pstmt.executeUpdate();
                System.out.println(count);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } finally {
                JDBCUtils.close(pstmt,conn);
            }
        }
    }
    
  • 相关阅读:
    把Asp.net Core程序代码部署到Ubuntu(不含数据库)
    2019周笔记(3.11-3.16)
    利用StackExchange.Redis和Log4Net构建日志队列
    Windows环境下安装配置Mosquitto服务及入门操作介绍
    2019周笔记(2.25-3.01)(压缩数据库)
    2019周笔记(2.18-2.23)
    WinForm客户端限速下载(C#限速下载)
    2019周笔记(2.14-2.17)(聚集索引、非聚集索引)
    高并发场景下秒杀项目静态锁的使用疑问
    线性结构队列以及应用(上)
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14083515.html
Copyright © 2011-2022 走看看