java 代码实现使用Druid 链接池获取数据库链接

Wesley13
• 阅读 813

因为原先使用的c3p0链接池,时常出现:APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks,以及出现线程死锁的情况导致服务器经常需要重启,很是头疼。所以考虑使用Druid 链接池来代替原先的c3p0.

Alibaba Druid中文文档

依赖jar包:

http://101.110.118.27/central.maven.org/maven2/com/alibaba/druid/0.1.18/druid-0.1.18.jar

https://mirrors.tuna.tsinghua.edu.cn/apache//commons/logging/binaries/commons-logging-1.2-bin.zip

  1. import java.sql.Connection;

  2. import java.sql.PreparedStatement;

  3. import java.sql.ResultSet;

  4. //引入站点的配置信息

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

  6. /**

  7. * 数据库连接生成类,返回一个数据库连接对象

  8. * 构造函数完成数据库驱动的加载和数据的连接

  9. * 提供数据库连接的取得和数据库的关闭方法

  10. * @author yuyu

  11. *

  12. */

  13. public class DbConnect {

  14. private static DruidDataSource dataSource=null;

  15. /**

  16. * 构造函数完成数据库的连接和连接对象的生成

  17. * @throws Exception

  18. */

  19. public DbConnect(){

  20. }

  21. public void GetDbConnect() throws Exception {

  22. try{

  23. if(dataSource==null){

  24. dataSource=new DruidDataSource();

  25. //设置连接参数

  26. dataSource.setUrl("jdbc:oracle:thin:@localhost:1521/orcl");

  27. dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");

  28. dataSource.setUsername("TrueTimeControl");

  29. dataSource.setPassword("1234");

  30. //配置初始化大小、最小、最大

  31. dataSource.setInitialSize(1);

  32. dataSource.setMinIdle(1);

  33. dataSource.setMaxActive(20);

  34. //连接泄漏监测

  35. dataSource.setRemoveAbandoned(true);

  36. dataSource.setRemoveAbandonedTimeout(30);

  37. //配置获取连接等待超时的时间

  38. dataSource.setMaxWait(20000);

  39. //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

  40. dataSource.setTimeBetweenEvictionRunsMillis(20000);

  41. //防止过期

  42. dataSource.setValidationQuery("SELECT 'x'");

  43. dataSource.setTestWhileIdle(true);

  44. dataSource.setTestOnBorrow(true);

  45. }

  46. }catch(Exception e){

  47. throw e;

  48. }

  49. }

  50. /**

  51. * 取得已经构造生成的数据库连接

  52. * @return 返回数据库连接对象

  53. * @throws Exception

  54. */

  55. public Connection getConnect() throws Exception{

  56. Connection con=null;

  57. try {

  58. GetDbConnect();

  59. con=dataSource.getConnection();

  60. } catch (Exception e) {

  61. throw e;

  62. }

  63. return con;

  64. }

  65. public static void main(String[] args) throws Exception {

  66. DbConnect dbConnect = new DbConnect();

  67. Connection connection = dbConnect.getConnect();

  68. String sql = "SELECT 1+1 from dual";

  69. PreparedStatement ps = connection.prepareStatement(sql);

  70. ResultSet resultSet = ps.executeQuery();

  71. if(resultSet.next()){

  72. System.out.println(resultSet.getInt(1));

  73. }

  74. }

  75. }

  • DRUID介绍

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。

  • 配置参数

和其它连接池一样DRUID的DataSource类为:com.alibaba.druid.pool.DruidDataSource,基本配置参数如下:

配置

缺省值

说明

name

 

配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 
如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)

jdbcUrl

 

连接数据库的url,不同数据库不一样。例如: 
mysql : jdbc:mysql://10.20.153.104:3306/druid2 
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

username

 

连接数据库的用户名

password

 

连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

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<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

如果没有导入commons-loggingjar包,则会报如下错误:

  1. java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案

  2. Spring3.1启动时报错:

  3. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

  4. at org.springframework.core.CollectionFactory.<clinit>(CollectionFactory.java:64)

  5. at org.springframework.core.SimpleAliasRegistry.<init>(SimpleAliasRegistry.java:41)

  6. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.<init>(DefaultSingletonBeanRegistry.java:73)

  7. at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.<init>(FactoryBeanRegistrySupport.java:41)

  8. at org.springframework.beans.factory.support.AbstractBeanFactory.<init>(AbstractBeanFactory.java:146)

  9. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.<init>(AbstractAutowireCapableBeanFactory.java:144)

  10. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.<init>(AbstractAutowireCapableBeanFactory.java:155)

  11. at org.springframework.beans.factory.support.DefaultListableBeanFactory.<init>(DefaultListableBeanFactory.java:121)

  12. at org.springframework.beans.factory.xml.XmlBeanFactory.<init>(XmlBeanFactory.java:72)

  13. at org.springframework.beans.factory.xml.XmlBeanFactory.<init>(XmlBeanFactory.java:61)

  14. at spring.test.SpringTest.main(SpringTest.java:12)

  15. Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

  16. at java.net.URLClassLoader$1.run(Unknown Source)

  17. at java.security.AccessController.doPrivileged(Native Method)

  18. at java.net.URLClassLoader.findClass(Unknown Source)

  19. at java.lang.ClassLoader.loadClass(Unknown Source)

  20. at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

  21. at java.lang.ClassLoader.loadClass(Unknown Source)

  22. ... 11 more

缺少 commons-logging.jar,也可以添加commons-logging-1.0.4.jar,建议使用后者或者更新版本。 

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
SpringBoot 开启Druid监控统计功能教程
Druid数据连接池简介Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。Druid是一个JDBC组件,它包括三部分:1.DruidDriver代理
Stella981 Stella981
3年前
Druid连接池简单入门配置
偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的。Druid集连接池,监控于一体整好复合当前项目的需要,项目是ssh结构,之前是用C3p0的,现在换一个连接池也是很简单的,首先spring配置DataSource,配置如下:<bean id"dataSource" class"co
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Stella981 Stella981
3年前
Spring4.0 + druid 配置动态配置数据源以及多数据源切换功能实现
数据源连接池使用druid其他的数据源基本原理相同spring中配置默认数据源连接池如下:<!数据源配置,使用BoneCP数据库连接池   <beanid"dataSourceOne"class"com.alibaba.druid.pool.DruidDataSource"initmethod"
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这