从JDBC连接池到Mybatis(连接池篇)

二:数据库连接池

缘由:原生的JDBC,频繁开启关闭数据库连接,浪费资源,且操作繁缛,数据库连接池应运而生。

概念:可以讲数据库连接池理解为一个容器(集合),用来存放数据库连接的容器。

           当系统初始化好之后,容器被创建,容器中会申请一些连接对象,当进行数据库访问时,

           从容器中获取连接对象,访问完毕之后,会将连接对象放回容器。

优点:1:解决原生JDBC资源浪费问题,可以节约资源;2:程序进行的数据库访问更加高效。

实现:javax.sql包下的 DataSoure 中提供获取连接的 getConnection() 方法,

          开发者不需要去实现该接口,由数据库厂商来实现它;

          而且如果连接对象 Connection 是由连接池中获取的,那么调用 connection.close() 方法时,

          则不在是关闭连接了,而是将连接归还。

C3P0:

   使用步骤:

                  1,导入jar:c3p0-0.9.5.2.jar  and  mchange-commons-java-0.2.12.jar 。

                  2,定义配置文件:c3p0.properties  or  c3p0-config.xml;将文件放在src目录下。

                  3,创建核心对象(数据库连接池对象):comboPooledDataSource

                  4,获取连接:getConnection()

配置文件:(c3p0-config.xml)
<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/jtdb-small</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/jtdb-small</property>
    <property name="user">root</property>
    <property name="password">123456</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>
代码案例:(C3p0Demo.java)
package c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3p0Demo {
    public static void main(String[] args) throws SQLException {
        //创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //获取连接对象
        Connection connection = ds.getConnection();
        //打印
        System.out.println(connection);
    }
}

Druid:

   使用步骤:

                  1,导入jar:druid-1.0.9.jar。

                  2,定义配置文件 druid.properties,加载配置文件获取连接池配置相关信息。

                  3,获取数据库连接池对象:通过工厂类获取,DruidDataSourceFactory。

                  4,获取连接:getConnection()。

配置文件:(druid.properties)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jtdb-small
username=root
password=123456
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
代码案例:(DruidDemo)
package Druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //导入jar
        //定义配置文件
        //加载配置文件
        Properties properties = new Properties();
        InputStream is =  
          DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(is);
        //获取连接池对象
        DataSource ds =  DruidDataSourceFactory.createDataSource(properties);
        Connection conn = ds.getConnection();

        System.out.println(conn);
    }
}
Druid连接池版JDBC工具类:
package Druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * Druid连接池版JDBC工具类
 */
public class JdbcUtils {
    //定义成员变量 DataSource
    private static DataSource ds;
    static {
        //加载配置文件
        Properties pro = new Properties();
        try {
            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();
    }

    /**
     * 释放资源
     * @param resultSet
     * @param preparedStatement
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet,
                             PreparedStatement preparedStatement,
                             Statement statement,
                             Connection connection){
        if(resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(preparedStatement != null){
            try {
                preparedStatement.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();
            }
        }
    }

    /**
     * 获取连接池
     */
    public static DataSource getDataSource(){
        return ds;
    }
}
工具类测试案例一:查询
package Druid;

import pojo.Item;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DruidDemo00 {
    public static void main(String[] args){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //获取连接
            connection = JdbcUtils.getConnection();
            //定义SQL语句
            String sql = "SELECT * FROM tb_item";
            //获取执行SQL的statement
            statement = connection.createStatement();
            //执行SQL获取结果集
            resultSet = statement.executeQuery(sql);
            //处理结果集
            List<Item> list = new ArrayList<Item>();
            Item item = new Item();
            while (resultSet.next()){
                Long id = resultSet.getLong("id");
                String title = resultSet.getString("title");
                BigDecimal price = resultSet.getBigDecimal("price");
                item.setId(id);
                item.setTitle(title);
                item.setPrice(price);
                list.add(item);
            }
            for (Item i : list) {
                System.out.println(i);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(resultSet,null,statement,connection);
        }

    }
}
工具类测试案例二:新增
package Druid;

import java.sql.*;
import java.util.Scanner;

public class DruidDemo01 {
    public static void main(String[] args){
        Connection connection = null;
        Statement statement = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //获取连接
            connection = JdbcUtils.getConnection();
            //定义SQL语句
            String sql = "insert into tb_item_desc VALUES(?,?,?,?)";
            //获取preparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //获取控制台输入
            Scanner scanner1 = new Scanner(System.in);
            System.out.println("请输入ID:");
            Integer id = scanner1.nextInt();
            Scanner scanner2 = new Scanner(System.in);
            System.out.println("请输入描述:");
            String desc = scanner2.nextLine();
            //替换占位符
            preparedStatement.setInt(1,id);
            preparedStatement.setString(2,desc);
            preparedStatement.setString(3,"2015-03-08 21:27:54");
            preparedStatement.setString(4,"2015-03-08 21:27:54");
            //获取结果
            int i = preparedStatement.executeUpdate();
            System.out.println(i);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(null,preparedStatement,null,connection);
        }

    }
}

本文只是个人学习内容整理的笔记,如有侵权,即联系870013269@qq.com删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值