Java-数据库连接池

Posted 东血

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-数据库连接池相关的知识,希望对你有一定的参考价值。

1.概念

  • 其实就是一个容器(集合),存放数据库连接的容器
  • 当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  • 好处:节约资源,用户访问高效

2.实现:

2.1 标准接口:DataSource javax.aql包下的

  1. 方法:
    • 获取连接:getConnextion()
    • 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭数据库了。而是归还连接
  2. 一般我们不去实现它,有数据库厂商实现

2.2 C3P0:数据库连接池技术

步骤

  1. 导入jar包(两个) c3p0-0.9.5.2 mchange-commons-java-0.2.12 mysql-connector-java-5.1.38
    • 不要忘记导入数据库的驱动架包
  2. 定义配置文件:
    • 名称:c3p0.propertie或者c3p0-config.xml
    • 路径:直接将文件放在src目录下即可
  3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  4. 获取连接:getConnection

配置文件

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</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.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</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>

代码如下

package cn.itcast.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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

public class C3P0Demo1 {
    public static void main(String[] args){
        //创建数据库连接池对象

        DataSource dataSource=new ComboPooledDataSource();
        //获取连接对象
        try {
            Connection connection=dataSource.getConnection();
            System.out.println(connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //打印

    }
}

2.3 Druid:数据库连接池技术,由阿里巴巴提供

步骤

1.导入jar包  druid-1.0.9
2.定义配置文件
    * 是properties形式的
    * 可以叫任意名称,可以放在任意目录下
3.加载配置文件,Properties
4.获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
5.获取连接:getConnection 

配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
# maxIdle=10
minIdle=3

代码如下

package cn.itcast.datasource.druid;

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;

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

定义Druid连接池工具类

---------定义一个类 JDBCUtils--------------------------
package cn.itcast.utils;

import cn.itcast.datasource.druid.DruidDemo;
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 {
    //定义成员变量 dataSource
    private static DataSource dataSource;

    static{
        try {
            //定义配置文件
            //加载配置文件
            Properties properties=new Properties();
            // InputStream inputStream= DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            // properties.load(inputStream);
            properties.load( DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
            //获取连接池对象
            dataSource= DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取连接
    public static Connection getConnection() throws SQLException {
    return dataSource.getConnection();
    }
    //释放资源
    public static void close(Statement statement,Connection connection){
        // if(statement!=null){
        //     try {
        //         statement.close();
        //     } catch (SQLException e) {
        //         e.printStackTrace();
        //     }
        // }
        // if(connection!=null){
        //     try {
        //         connection.close();
        //     } catch (SQLException e) {
        //         e.printStackTrace();
        //     }
        // }
        close(null,statement,connection);

    }
    public static void close(ResultSet resultSet, Statement statement, Connection connection){
        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();
            }
        }
    }
    //获取连接池方法
    public static DataSource getDataSource(){
        return  dataSource;
    }
}
-------------提供静态代码块加载配置文件,初始化连接对象-----------------------
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
# maxIdle=10
minIdle=3
-----------------提供方法----------------------------------------------------
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法
package cn.itcast.datasource.druid;

import cn.itcast.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class DruidDemo2 {
    public static void main(String[] args) throws Exception {
    //完成添加操作。给account表添加一条记录
        //获取连接
        Connection connection= JDBCUtils.getConnection();
        //定义SQL
        String sql="insert into account values(null,?,?)";
        //获取pstmt对象
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        //给?赋值
        preparedStatement.setString(1,"wangwu");
        preparedStatement.setDouble(2,3000);
        //执行SQL
        int count=preparedStatement.executeUpdate();
        //打印
        System.out.println(count);
    }
}

以上是关于Java-数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

java sql数据连接池的问题?

JAVA连接池技术

java数据库连接池的介绍与定义一个简单的连接池

JAVA基础:JDBC的使用 附详细代码

java代码实现数据源切换(连接池简单粗暴)

用Java手动封装JDBC连接池