数据库连接池(DBCP,C3P0,Druid),DBUtils工具类

为什么要有连接池?

建立数据库连接是一种非常耗时、耗资源的行为,所以通过数据库预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接库中申请一个就行,使用完毕再归还到连接池中。

1、数据库连接池的作用

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

2、DBCP连接池
(1)使用

DBCP(DataBase Connection Pool)数据库连接池, 是Java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
使用步骤

1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
(2)代码演示
package com.DBCP;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Properties;
public class dbcp {
    public static void main(String[] args) throws Exception {
        //采用配置文件的方式
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/dbcp.properties"));
        //创建连接池
        DataSource dataSource = new BasicDataSourceFactory().createDataSource(properties);
        //获取连接对象
        Connection connection = dataSource.getConnection();
        String sql="insert into demo2 values(?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,"王五");
        preparedStatement.setInt(2,2000);
        int i = preparedStatement.executeUpdate();
        System.out.println(i);
    }
}

配置文件

#连接基本设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
username=root
password=123456
#<!--扩展配置 了解-->
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
3、C3P0连接池
(1)使用

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
使用方法

1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
(2)DBCP和C3P0的区别
  • dbcp没有自动回收空闲连接的功能
  • c3p0有自动回收空闲连接功能
(3)代码演示
package com.C3P0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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

public class c3p0 {
    public static void main(String[] args) throws SQLException {
        //c3p0使用配置文件的方式 也可以使用xml配置文件
        //1.配置文件名是固定的c3p0.properties
        //2.文件必须放在src下
        //ComboPooledDataSource()中也可以传入参数 默认是第一配置 xml中可以传入第二配置名
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        Connection connection = comboPooledDataSource.getConnection();
        String sql="select *from demo2";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            String string = resultSet.getString(1);
            int anInt = resultSet.getInt(2);
            System.out.println(string + "==" + anInt);
        }
    }
}

配置文件

c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
c3p0.user=root
c3p0.password=123456
4、Druid连接池
(1)简述

DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。
使用步骤

1.导入德鲁伊的jar包
2.调用api
(2)代码演示
package com.Druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class druid {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        Connection connection = dataSource.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select *from demo2");
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            String string = resultSet.getString(1);
            int anInt = resultSet.getInt(2);
            System.out.println(string + "==" + anInt);
        }
    }
}

配置文件

#\u57FA\u672C\u914D\u7F6E
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
username=root
password=123456
#\u6269\u5C55\u914D\u7F6E
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
5、DBUtils
(1)概述

Commons DBUtils是Apache阻止提供的一个对JDBC进行简单封装的开源工具类库。

(2)使用步骤
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
	queryrunner作用:操作sql语句
	构造方法:new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
	query(..):执行r操作
	update(...):执行cud操作		
(3)代码演示
package com.DBUtils;

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

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

public class dbutils {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
        QueryRunner queryRunner = new QueryRunner(dataSource);
        String sql="select *from demo2 where money=?";
       //将查询出的结果保存在User中 集合中
        List<User> list = queryRunner.query(sql, new BeanListHandler<User>(User.class), 1000);
        System.out.println(list);
    }
}
package com.DBUtils;
public class User {
        private String name;
        private double money;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getMoney() {
            return money;
        }
        public void setMoney(double money) {
            this.money = money;
        }
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", money=" + money +
                    '}';
        }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值