连接池

本文介绍了Java中的数据库连接池,包括DBCP、c3p0和Druid的使用步骤,强调了Druid的常见性。此外,还详细讲解了Apache的commons-dbutils工具库,它是对JDBC的简单封装,简化了数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连接池

  1. 概述:连接池就是一个装有与数据库连接的容器,通过连接池预先同数据库建立一些连接放在内存中,当应用程序需要建立连接时直接从连接池中申请一个使用,使用完毕后在归还给连接池
  2. 为什么要有连接池?
    建立与数据库的连接是一种非常耗时,耗资源的行为,可以通过使用连接池早已建立好的连接优化这一行为
  3. 三种常见的连接池:DBCP连接池,c3p0连接池,阿里德鲁伊Druid连接池

DBCP连接池

使用步骤:
(1)引入数据库驱动jar包和DBCP两个jar包
在这里插入图片描述
(2)导入配置文件
在这里插入图片描述
(3)两种使用方式
方式1:硬编码,不用配置文件:

package org.westos.demo;

import org.apache.commons.dbcp.BasicDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MyTest {
    public static void main(String[] args) throws SQLException {
        //导入数据库驱动jar包和两个DBCPjar包
        //创建连接池对象
        BasicDataSource bd = new BasicDataSource();
        //设置四个基本参数
        bd.setDriverClassName("com.mysql.jdbc.Driver");
        bd.setUrl("jdbc:mysql://localhost:3306/mydb");
        bd.setUsername("数据库名");
        bd.setPassword("数据库密码");
        //从连接池中获取一个连接对象
        Connection connection = bd.getConnection();
        //获取操作对象
        PreparedStatement preparedStatement = connection.prepareStatement("select * from users");
        ResultSet resultSet = preparedStatement.executeQuery();
        //拿出数据库中的数据
        while(resultSet.next()){
            String string1 = resultSet.getString(1);
            String string2 = resultSet.getString(2);
            System.out.println(string1);
            System.out.println(string2);
        }
        //释放资源
        connection.close();
        resultSet.close();
    }
}

方式2:使用配置文件:

package org.westos.demo;

import org.apache.commons.dbcp.BasicDataSourceFactory;

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

public class MyTest {
    public static void main(String[] args) throws Exception {
        //导入数据库驱动jar包和两个DBCPjar包
        //导入DBCP配置文件
        //读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("dbcp.properties"));
        //创建连接池对象
        DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
        //从连接池中获取一个连接对象
        Connection connection = ds.getConnection();
        //之后的获取操作对象,拿出数据,释放资源就跟硬编码方式一样了
    }
}

c3p0连接池

使用步骤:
(1)引入数据库驱动jar包和一个c3p0的jar包
在这里插入图片描述
(2)导入配置文件
在这里插入图片描述
注意:c3p0的配置文件名固定,必须是c3p0.properties且文件必须放在src目录下
(3)使用方式:
硬编码:

package org.westos.demo;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;

public class MyTest {
    public static void main(String[] args) throws Exception {
        //引入数据库驱动jar包和一个c3p0的jar包
        //硬编码
        //创建c3p0连接池
        ComboPooledDataSource pd = new ComboPooledDataSource();
        //设置参数
        pd.setDriverClass("com.mysql.jdbc.Driver");
        pd.setJdbcUrl("jdbc:mysql:///mydb");
        pd.setUser("数据库名");
        pd.setPassword("数据库密码");
        //从池中取出一个连接对象
        Connection connection = pd.getConnection();
        System.out.println(connection);
        //之后的获取操作对象,拿出数据,释放资源就省略了,都是一样的
    }
}

使用配置文件:

package org.westos.demo;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;

public class MyTest {
    public static void main(String[] args) throws Exception {
        //引入数据库驱动jar包和一个c3p0的jar包
        //导入配置文件
        //创建连接池
        ComboPooledDataSource pd = new ComboPooledDataSource();
        //取出一个连接池对象
        Connection connection = pd.getConnection();
        System.out.println(connection);
        //之后的获取操作对象,拿出数据,释放资源省略
    }
}

DBCP和c3p0的区别: DBCP没有自动回收空闲连接的功能,而c3p0有

阿里德鲁伊Druid连接池

使用步骤:
(1)引入数据库驱动jar包和一个druid的jar包
在这里插入图片描述
(2)导入配置文件
在这里插入图片描述
(3)使用方式:
硬编码:

package org.westos.demo;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

public class MyTest {
    public static void main(String[] args) throws Exception {
        //引入数据库驱动jar包和一个druid的jar包
        //创建连接池
        DruidDataSource dd = new DruidDataSource();
        //设置参数
        dd.setDriverClassName("com.mysql.jdbc.Driver");
        dd.setUrl("jdbc:mysql://localhost/mydb");
        dd.setUsername("数据库名");
        dd.setPassword("数据库密码");
        //从池中取出一个连接对象
        DruidPooledConnection connection = dd.getConnection();
        //获取操作对象
        //拿出数据
        //释放资源
    }
}

使用配置文件:

package org.westos.demo;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class MyTest {
    public static void main(String[] args) throws Exception {
        //引入数据库驱动jar包和一个druid的jar包
        //导入配置文件
        //创建连接池
        Properties properties = new Properties();
        properties.load(new FileInputStream("druid.properties"));
        DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
        //从池中取出一个连接对象
        Connection connection = ds.getConnection();
        System.out.println(connection);
        //获取操作对象
        //拿出数据
        //释放资源
    }
}

三种连接池都很常见,注意在使用的时候引入相应的jar包和导入对应的配置文件,而无论使用哪种连接池,数据库的驱动jar包都是必须要引入的。其中,最常见的是阿里德鲁伊Druid连接池

commons-dbutils工具类库

  1. 概述:该工具类库是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,它能够起到简化JDBC应用程序,同时也不会影响程序性能的作用
  2. 使用:
    (1)引入druid连接池的jar包和工具jar包,导入druid配置文件
    在这里插入图片描述
    (2)代码演示:
package org.westos.demo;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.List;
import java.util.Properties;

public class MyTest {
    public static void main(String[] args) throws Exception {
        //引入jar包,导入配置文件
        //创建连接池
        Properties properties = new Properties();
        properties.load(new FileInputStream("druid.properties"));
        DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
        //获取操作对象
        QueryRunner runner = new QueryRunner(ds);
        //使用DML语句
        runner.update("insert into users value(?,?)", "zhangsan", "123456");
        //使用DQL语句
        //拿出数据库中指定的数据
        User user = runner.query("select * from users where username=?", new BeanHandler<User>(User.class), "zhangsan");
        System.out.println(user);
        //拿出数据库中的所有数据
        List<User> query = runner.query("select * from users", new BeanListHandler<User>(User.class));
        //重写User类中的toString方法,输出结果
        System.out.println(query);
    }
}

结果:
在这里插入图片描述
可以看出,工具类库中直接有updete()和query()方法操作DML、DQL语句,且返回值直接就能拿到数据库里的内容,比JDBC简单了一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值