一.连接池
1.连接池概述
目的:为了解决建立数据库连接耗费资源和时间很多的问题,提高性能。
Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了(close).每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.
连接池初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.
例子:
老方式:生产出来,用完就销毁了
连接池方式 摩拜单车:骑之前, 有一个公司生产了很多的自行车, 需要骑车, 直接扫码使用就好了, 然后骑完之后, 还回去
2 .连接池原理
- 程序一开始就创建一定数量的连接,放在一个容器(集合)中,这个容器称为连接池。
- 使用的时候直接从连接池中取一个已经创建好的连接对象。
- 关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中。
3 编写标准的数据源(规范)
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各
个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的
切换不同厂商的连接池!
常见的第三方连接池如下:C3P0,阿里巴巴-德鲁伊druid连接池
二.Druid 连接池
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是国内目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。如:一年一度的双十一活动,每年春运的抢火车票。
Druid的下载地址:https://github.com/alibaba/druid
1. 导入jar包 druid-1.1.12.jar
2. 定义配置文件
3. 加载配置文件
4. 获取数据库连接池对象
5. 获取连接
1. 编写 druid.properties
2 编写DBUtil工具类
三.JDBC小总结
属性 | 建议值 | 说明 |
url | 数据库的jdbc连接地址。一般为连接oracle/mysql。示例 如下: mysql : jdbc:mysql://ip:port/dbname option1&option2&… oracle : jdbc:oracle:thin:@ip:port:oracle_sid | |
password | 登录数据库的用户密码 | |
username | 登录数据库的用户名 | |
initialSize | 10-50已足够 | 启动程序时,在连接池中初始化多少个连接 |
maxActive | 连接池中最多支持多少个活动会话 | |
maxWait | 100 | 程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池 没有可用连接,单位毫秒,设置-1时表示无限等待 |
minEvictableIdleTimeMillis | 见说明部 | 池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将 见说明部分回收该连接,要小于防火墙超时设置 net.netfilter.nf_conntrack_tcp_timeout_established的设置 |
属性 | 建议值 | 说明 |
timeBetweenEvictionRunsMillis | 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查 | |
keepAli | true | 程序没有close连接且空闲时长超过 过minIdle指定的连接个数 |
minIdle | 与initialSize 相同 | 回收空闲连接时,将保证至少有minIdle个连接 |
removeAbandoned | false,当发现 程序有 | 要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该 |
正常close连 接时设置为 true | 连接,不管该连接中是活动还是空闲, 以防止进程不会进行 close而霸占连接 | |
removeAbandonedTimeout | 应大于业务 运行最长时间 | 设置druid 强制回收连接的时限,当程序从池中get到连接 开始算起,超过值后,druid将强制回收该连接,单位秒。 |
logAbandoned | true | 当druid强制回收连接后,是否将stack trace 记录到日志中 |
testWhileIdle | true | 当程序请求连接,池在分配连接时,是否先检查该连接是 否有效。(高效) |
validationQuery | 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据 库执行该SQL, 如果正常返回,则表示连接可用,否则表示连接不可用 | |
testOnBorrow | false | 程序 申请 连接时,进行连接有效性检查(低效,影响性能) |
testOnReturn | false | 程序 返还 连接时,进行连接有效性检查(低效,影响性能) |
poolPreparedStatements | true | 缓存通过以下两个方法发起的SQL:
int resultSetConcurrency |
maxPoolPrepareStatementPerConnectionSize | 20 | 每个连接最多缓存多少个SQL |
filters | stat,wall,slf4j | 这里配置的是插件,常用的插件有: 监控统计: filter:stat 日志监控: filter:log4j 或者 slf4j 防御SQL注入: filter:wall |
connectProperties | 连接属性。比如设置一些连接池统计方面的配置。 true;druid.stat.slowSqlMillis=5000 |