java数据库连接池

什么是数据库连接池

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

连接池优势:
1. 节约资源
2. 用户访问高效

实现连接池

  • 标准接口:javax.sql包下的DataSource
    方法:
    获取连接:getConnection()
    归还连接:Connection.close()。

如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接。

标准接口的实现类一般有数据库厂商提供:

C3P0:数据库连接池技术

c3p0是一个易于使用的库,通过使用jdbc3规范和jdbc2的可选扩展定义的功能来扩展传统JDBC驱动程序,从而使其“企业就绪”。从0.9.5版开始,c3p0完全支持jdbc4规范。

特别是,c3p0提供了一些有用的服务:
一个类,它使传统的基于DriverManager的JDBC驱动程序适应最新的javax.sql.DataSource方案,以获取数据库连接。
DataSources后面的Connection和PreparedStatement的透明池可以“包装”传统驱动程序或任意非池化DataSources。
该库尽力使细节正确:

c3p0数据源既可引用,也可序列化,因此适用于绑定到各种基于JNDI的命名服务。
检入池中的连接和语句时,将仔细清理语句和结果集,以防止客户端使用仅清除其连接的惰性但常见的资源管理策略时资源耗尽。

该库采用JDBC 2和3规范定义的方法(即使这些与库作者的首选项冲突)。数据源以JavaBean样式编写,提供了所有必需和大多数可选属性(以及一些非标准属性)以及无参数构造函数。实现了所有JDBC定义的内部接口(ConnectionPoolDataSource,PooledConnection,生成ConnectionEvent的Connection等)。您可以将c3p0类与兼容的第三方实现混合使用(尽管并非所有c3p0功能都可以与ConnectionPoolDataSource的外部实现一起使用)。

C3P0使用示例

首先导入jar包
c3p0所需的jar包通过百度云盘分享给大家:
链接:https://pan.baidu.com/s/1RjWoaIZu8rAzUbhZ3FcF3Q
提取码:zt0v

然后需要编写配置文件c3p0-config.xml(该配置文件放在src目录下)

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <!-- class_db为连接的数据库名 -->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/class_db?useSSL=false&amp;serverTimezone=UTC</property>
    <property name="user">root</property>
    <property name="password">qwe123</property>
    <!-- 连接池参数 -->
    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>
</c3p0-config>

最后编写java文件

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class C3P0Test {
    public static void main(String[] args) throws SQLException {
        //1. 获取DataSource,使用默认配置
        DataSource ds  = new ComboPooledDataSource();
        //2.获取连接
        Connection conn = ds.getConnection();
        String sql = "update student set age = ? where id = ?";
        PreparedStatement pstm = conn.prepareStatement(sql);
        pstm.setInt(1,22);
        pstm.setInt(2,22);
        int count = pstm.executeUpdate();
        System.out.println(count);
    }
}

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

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

druid的优点

  • 高性能。性能比c3p0高很多。
  • 支持性好。只要是jdbc支持的数据库,druid都支持,并且Druid针对oracle、mysql做了优化。
  • 提供监控功能。Druid可以很好的监控DB池连接和SQL的执行情况,方便统计、分析SQL的执行性能

Druid使用示例

首先导入所需jar包(通过百度云盘分享给大家)
链接:https://pan.baidu.com/s/1GarY3FBSLFytnmsXxy6fQA
提取码:7eyd
编写配置文件druid.properties

driverClassName=com.mysql.cj.jdbc.Driver
#class_db为连接的数据库名
url=jdbc:mysql://localhost:3306/class_db?useSSL=false&serverTimezone=UTC
username=root
password=qwe123
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
filters=stat
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200

编写java文件

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DruidTest {
    public static void main(String[] args) throws Exception {
        //1.导入jar包
        //2.定义配置文件
        //3.加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        //4.获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //5.获取连接
        Connection conn = ds.getConnection();
        String sql = "update student set age = ? where id = ?";
        PreparedStatement pstm = conn.prepareStatement(sql);
        pstm.setInt(1,22);
        pstm.setInt(2,22);
        int count = pstm.executeUpdate();
        System.out.println(count);
    }
}

今天分享就到这了,希望大家有所收获,欢迎关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值