简单的数据库连接池

目录

一.数据库连接池的概念

二.简单的自定义数据库连接池

1.提供JDBC工具类

2.自定义数据库连接池

3.调用数据库连接池获取数据库连接对象

三.第三方提供的数据库连接池

1.数据库连接池规范

2.第三方数据库需要的jar包

3.Druid入门小案例


一.数据库连接池的概念

  • 数据库连接池:存储数据库连接对象的池子。是一个容器,里面装了数据库连接对象
  • 连接池:提供了一种池子的思想,包括数据库连接池、线程池
  • 数据库连接池的作用:使用数据库连接池,避免了重复创建Connection对象-消亡-创建-消亡
  • 数据库连接池提供了一个池子,里面已经提前准备好了一些连接对象,需要使用的时候直接从池子里取,用完再归还即可,节省时间和资源

二.简单的自定义数据库连接池

方便理解数据库连接池而写的demo,使用第三方数据库连接池可跳到目录三

1.提供JDBC工具类

JDBC工具类:JdbcUtils.java

package com.rabbit.jdbc;

import java.sql.*;
import java.util.Properties;

//封装JDBC工具类
public class JdbcUtils {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;

    static {
        try{
            //加载配置文件
            Properties p = new Properties();
            p.load(JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));

            //获取数据
            driver = p.getProperty("driver");
            url = p.getProperty("url");
            user = p.getProperty("user");
            password = p.getProperty("password");

            //1.注册驱动
            Class.forName(driver);
        }catch (Exception e){
            System.out.println("jdbc初始化失败");
        }
    }

    public static Connection getConnection() throws Exception{
        //2.获取数据库连接对象
        Connection conn = DriverManager.getConnection(url,user,password);

        return conn;
    }

    public static void close(ResultSet rs, Statement state,Connection conn){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(state != null){try {
            state.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }}

        if(conn != null){try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }}
    }

    public static void close(Statement state,Connection conn){
        if(state != null){try {
            state.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }}

        if(conn != null){try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }}
    }

}

配置文件jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://172.16.0.130:7302/recruitment
user=admin
password=1234

JDBC工具类说明 

  1. 定义一个工具类,把连接数据库、释放资源封装起来
  2. 为了避免创建多个注册驱动对象,把注册驱动代码放在静态代码块中
  3. 因为数据库类型、数据库连接地址、数据库账号密码可能发生变化,将这些信息放在properties配置文件中
  4. 增删改 和 查询需要释放的资源不一样,使用方法重载

2.自定义数据库连接池

package com.rabbit.jdbc;

import java.sql.Connection;
import java.util.LinkedList;

public class MyPool {
    //创建数据库连接对象
    private static LinkedList<Connection> pool = new LinkedList<Connection>();
    static {
        try {
            for(int i = 1; i <= 5; i++){
                Connection conn = JdbcUtils.getConnection();
                pool.add(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //提供获取数据库连接对象的方法
    public static synchronized Connection getConnection(){
        if(pool.size() > 0){
            return pool.removeFirst();
        }
        throw new RuntimeException("服务器忙,请稍后");
    }

    //提供归还数据库连接对象的方法
    public static void close(Connection conn){
        pool.addLast(conn);
    }
}

3.调用数据库连接池获取数据库连接对象

package com.rabbit.jdbc;

import java.sql.Connection;

public class Demo04 {
    public static void main(String[] args) throws Exception {
        //从数据库连接池中获取对象
        for(int i = 1; i <= 6; i++){
            Connection conn = MyPool.getConnection();
            System.out.println(conn);

            if(i == 3){
                MyPool.close(conn);
            }
        }
    }
}

三.第三方提供的数据库连接池

1.数据库连接池规范

SUN公司提供了一个数据库连接池接口:DataSource

Java中所有第三方数据库连接池都要实现这个接口,重写里面的方法:

2.第三方数据库需要的jar包

常用的第三方数据库连接池有C3P0和Druid,其中Druid是由阿里巴巴提供的。

使用C3P0需要的jar包:

使用Druid需要的jar包:

3.Druid入门小案例

DruidDemo.java

package com.rabbit.jdbc;

import java.sql.Connection;
import java.util.Properties;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.util.Properties;

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //从配置文件中获取数据库信息
        Properties p = new Properties();
        p.load(DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));

        //创建数据库连接池对象
        DataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(p);

        //获取数据库连接对象
        Connection conn = dataSource.getConnection();
        System.out.println(conn);

        //归还数据库连接对象
        conn.close();
    }
}

Druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://172.16.0.130:7302/recruitment
username=admin
password=1234
initialSize=5
maxActive=10
maxWait=10000
  • initialSize:初始数据库连接对象个数 
  • maxActive:最大连接个数
  • maxWait:超过等待时间

如果遇到空指针异常问题,File -> Projects Structure -> Modules,切换到Resources,右键src,选择Sources

猜你喜欢

转载自blog.csdn.net/weixin_60968208/article/details/128497028