数据库连接池


Posted in MySQL onApril 06, 2021

数据库连接池

普通的连接方式不停的连接和断开会消耗大量的资源和时间,没有对资源进行很好的重复利用,不能控制被创建的连接对象数。并且每一次使用完都必须断开,否则如果程序出现异常而未能关闭,将会导致数据库系统的内存泄漏最终重启数据库。

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。用时则取,完时则还。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

多种开源的数据库连接池:

JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,改接口通常由(Weblogic,WebSphere,Tomcat)提供实现,也有一些开源组织提供实现:

  • DBCP是Apache提供的数据库连接池。Tomcat服务器自带dbcp数据库连接池。速度相对于C3P0较快,但因自身存在BUG,Hibernate3已不再提供支持。
  • C3P0是一个开源组织提供的一个数据库连接池,速度相对较慢,但是稳定性不错。hibernate官方推荐使用。
  • Proxool是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较C3P0差一点。
  • BoneCP是一个开源组织提供的数据库连接池,速度快。
  • Druid是阿里提供的数据库连接池。

在这里我们只看Druid,它是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,也可以说是目前最好的连接池之一。

首先将驱动配置好

数据库连接池

连接方式一:硬编码,不推荐

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

import java.sql.SQLException;

public class DruidTest {
    public static void main(String[] args) throws SQLException {
        DruidDataSource dds = new DruidDataSource();
        dds.setDriverClassName("com.mysql.jdbc.Driver");
        dds.setUrl("jdbc:mysql://localhost:3306/test");
        dds.setUsername("root");
        dds.setPassword("root");

        DruidPooledConnection c = dds.getConnection();
        System.out.println(c);
    }
}

执行结果:红色是提示信息,不是报错。

数据库连接池

连接方式二:配置文件,推荐

配置参数(常用):

配置 缺省 说明
name   配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 如果没有配置,将会生成一个名字,格式是:”DataSource-” + System.identityHashCode(this)
url   连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username   连接数据库的用户名
password   连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。
driverClassName   根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive 8 最大连接池数量
maxIdle 8 已经不再使用,配置了也没效果
minIdle   最小连接池数量
maxWait   获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery   用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
testOnBorrow true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis   有两个含义: 1)Destroy线程会检测连接的间隔时间2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun   不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis    
connectionInitSqls   物理连接初始化的时候执行的sql
exceptionSorter   根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
filters   属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
proxyFilters   类型是List,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

第一步:创建properties配置文件

url=jdbc:mysql://localhost:3306/test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver

注:根据自己的需求可以写自己需要的配置,但上边这四个基本信息是必须要有的。

第二步:获取连接

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class DruidTest2 {
    public static void main(String[] args) throws Exception {
        Properties p = new Properties();
        InputStream is = ClassLoader.getSystemResourceAsStream("druid.properties");
        p.load(is);
        DataSource ds = DruidDataSourceFactory.createDataSource(p);
        Connection c = ds.getConnection();
        System.out.println(c);
    }
}
MySQL 相关文章推荐
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
mysql优化
Apr 06 #MySQL
Windows10下安装MySQL8
Mysql 如何批量插入数据
Apr 06 #MySQL
MySQL之DML语言
Apr 05 #MySQL
多属性、多分类MySQL模式设计
Apr 05 #MySQL
多表查询、事务、DCL
Mysql Show Profile
Apr 05 #MySQL
You might like
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
php在线代理转向代码
2012/05/05 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
一分钟理解js闭包
2016/05/04 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python实现手势识别的示例(入门)
2020/04/15 Python
利用python进行文件操作
2020/12/04 Python
python中re模块知识点总结
2021/01/17 Python
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
年终晚会主持词
2014/03/25 职场文书
文明市民先进事迹
2014/05/15 职场文书
优秀员工自荐书
2015/03/06 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS