初识数据库连接池开源框架Druid

Druid是阿里巴巴的一个数据库连接池开源框架,准确来说它不仅仅包括数据库连接池这么简单,它还提供强大的监控和扩展功能。本文仅仅是在不采用Spring框架对Druid的窥探,采用目前最新版本druid1.0.26 github地址:https://github.com/alibaba/druid

在开始之前还是再说说为什么不配套使用Spring来使用Druid连接池,原因其实很简单,在Spring框架的配置文件中仅仅一个配置datasource就可以使用Druid了。那到底配置这个datasource数据源时Spring到底对它做了什么呢?它到底是怎么来实现这个datasource数据源的呢?如果不知其二只知其一,那才真是只是个搬砖的。

下面我们正式开始吧,首先还是一览工程包结构。

同样有两个jar需要引入,一是druid,二是mysql-connector。

我们首先实现util包里的DBPoolConnection类,这个类用来创建数据库连接池单例以及返回一个数据库连接。为什么数据库连接池需要单例呢?原因其实很简单,我们可以想象在一个web应用中,同时可能会存在多个请求如果为每一个请求都创建一个数据库连接池,那还有什么意义呢?应该是不论有多少个并发请求,都应该只存在一个数据库连接池,在这个数据库连接池中为每个请求创建一个数据库连接

 1 package util;
 2
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.InputStream;
 6 import java.sql.SQLException;
 7 import java.util.Properties;
 8
 9 import com.alibaba.druid.pool.DruidDataSource;
10 import com.alibaba.druid.pool.DruidDataSourceFactory;
11 import com.alibaba.druid.pool.DruidPooledConnection;
12
13 /**
14  * 要实现单例模式,保证全局只有一个数据库连接池
15  * @author ylf
16  *
17  * 2016年10月21日
18  */
19 public class DBPoolConnection {
20     private static DBPoolConnection dbPoolConnection = null;
21     private static DruidDataSource druidDataSource = null;
22
23     static {
24         Properties properties = loadPropertiesFile("db_server.properties");
25         try {
26             druidDataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);    //DruidDataSrouce工厂模式
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30     }
31
32     /**
33      * 数据库连接池单例
34      * @return
35      */
36     public static synchronized DBPoolConnection getInstance(){
37         if (null == dbPoolConnection){
38             dbPoolConnection = new DBPoolConnection();
39         }
40         return dbPoolConnection;
41     }
42
43     /**
44      * 返回druid数据库连接
45      * @return
46      * @throws SQLException
47      */
48     public DruidPooledConnection getConnection() throws SQLException{
49         return druidDataSource.getConnection();
50     }
51     /**
52      * @param string 配置文件名
53      * @return Properties对象
54      */
55     private static Properties loadPropertiesFile(String fullFile) {
56         String webRootPath = null;
57         if (null == fullFile || fullFile.equals("")){
58             throw new IllegalArgumentException("Properties file path can not be null" + fullFile);
59         }
60         webRootPath = DBPoolConnection.class.getClassLoader().getResource("").getPath();
61         webRootPath = new File(webRootPath).getParent();
62         InputStream inputStream = null;
63         Properties p =null;
64         try {
65             inputStream = new FileInputStream(new File(webRootPath + File.separator + fullFile));
66             p = new Properties();
67             p.load(inputStream);
68         } catch (Exception e) {
69             e.printStackTrace();
70         } finally {
71             try {
72                 if (null != inputStream){
73                     inputStream.close();
74                 }
75             } catch (Exception e) {
76                 e.printStackTrace();
77             }
78         }
79
80         return p;
81     }
82
83 }

第26行代码实例化一个DruidDataSource时,我们可以通过Druid框架为我们提供的DruidDataSourceFactory创建出一个DruidDataSource实例,工厂模式给我们提供了大大的便利。

第36行getInstance方法为我们创建出一个数据库连接池实例,这里即用到了单例模式,在这个地方我们可以使用synchronized方法来对getInstance加锁(懒加载)实现线程安全,同时我们也可以使用勤加载来实现线程安全即去掉synchronized关键字,删掉37-39行代码,将第20行代码修改为private static DBPoolConnection dbPoolConnection = new DBPoolConnection()。这两种方式各有其优缺点,懒加载好处就是“用到才实例化”,缺点就是“synchronized关键字对方法加锁的粒度稍稍有点大,采用同步的方式实现线程安全会带来额外的开销”,而勤加载的好处就是“不使用同步的方式实现线程安全,省去了同步机制带来的额外开销”,缺点即是“未用到也会实例化”。至于怎么选择,根据实际情况。这里是之前对单例模式的两篇博文,《单例模式》《再说单例模式的线程安全问题》

第55行代码loadPropertiesFile方法是对properties配置文件的加载。

我们在这个类所做的工作差不多就是在spring配置文件中的那一句<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">。很简单的一句话,这就是为什么我不想使用Spring框架来配合使用Druid,因为这只会造成只知其一不知其二的结果。

我们接在来实现dao包中的DruidDao类,开始对数据进行持久化操作。由于我们没有用到MyBatis等持久层框架,所以我们不得不使用JDBC来操作数据库,虽然麻烦一点,但这是所有所有框架的基础。

 1 /**
 2  *
 3  */
 4 package dao;
 5
 6 import java.sql.PreparedStatement;
 7 import java.sql.SQLException;
 8
 9 import com.alibaba.druid.pool.DruidPooledConnection;
10
11 import util.DBPoolConnection;
12
13 /**
14  * @author ylf
15  *
16  * 2016年10月21日
17  */
18 public class DruidDao {
19
20     public void insert(String sql){
21         DBPoolConnection dbp = DBPoolConnection.getInstance();    //获取数据连接池单例
22         DruidPooledConnection conn = null;
23         PreparedStatement ps = null;
24         try {
25             conn = dbp.getConnection();    //从数据库连接池中获取数据库连接
26             ps = conn.prepareStatement(sql);
27             ps.executeUpdate();
28         } catch (SQLException e) {
29             e.printStackTrace();
30         } finally {
31             try {
32                 if (null != ps){
33                     ps.close();
34                 }
35                 if (null != conn){
36                     conn.close();
37                 }
38             } catch (Exception e) {
39                 e.printStackTrace();
40             }
41         }
42     }
43 }

我们只对数据做插入操作。下面我们测试一下,各个属性的含义可参考:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

 1 /**
 2  *
 3  */
 4 package test;
 5
 6 import dao.DruidDao;
 7
 8 /**
 9  * @author ylf
10  *
11  * 2016年10月21日
12  */
13 public class Client {
14
15     /**
16      * @param args
17      */
18     public static void main(String[] args) {
19         DruidDao druidDao = new DruidDao();
20         String sql = "insert into test (name) values(\"keven\")";
21         druidDao.insert(sql);
22     }
23
24 }

查看数据库插入成功。

另外db_server.properties数据库的配置文件如下:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/DruidTest
username=root
password=0000
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
时间: 2024-09-27 04:11:50

初识数据库连接池开源框架Druid的相关文章

初识轻量级Java开源框架 --- Spring

初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spring是一个轻量级Java框架,其核心思想就是DI(Dependency Injection,即依赖注入)和IoC(Inversion of Control,即控制反转),因为其开源.低侵入性,现在已经席卷了很大一部分市场,其最大竞争对手乃是JavaEE框架EJB.EJB3.0以前,由于其笨重以及使用

数据库连接池的选择 Druid

我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了.这个时候,我们与数据库之间的连接就是「数据库连接」. 这个时候问题就来了,当我们仅仅只需要去取一个东西的时候,我们取完东西随手关上门,然后拔出钥匙,这完全是再正常不过的流程了,完全没毛病,但是,我们大部分时间是需要一件件的把仓库中的东西搬到外面停放的大卡车上,那这时候我们如果取一件东西把门锁上,然后

开源框架是如何通过JMX来做监控的(一) - JMX简介和Standard MBean

相关文章目录: 开源框架是如何通过JMX来做监控的(一) - JMX简介和Standard MBean 开源框架是如何通过JMX来做监控的(二) - Druid连接池的监控 相信很多做Java开发的同学都使用过JDK自带的 jconsole 或者 jvisualvm 监控过JVM的运行情况,但不知道有没有留意过它们会有一个MBean的功能/标签,通过MBean可以看到在JVM中运行的组件的一些属性和操作 例如,可以看到Tomcat 8080端口Connector的请求连接池信息,Druid数据库

数据库连接池c3p0

一.概述: 数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,c3p0有两种数据源管理方式,一种是通过程序变本身来进行管理,还有一种是通过容器管理,本节讨论通过程序本身来进行管理,下一节讨论通过容器进行管理. 二.c3p0的三种实现方式 1.实现方式一:利用c3p0的API自己动手写代码,实现数据源 例如:在类路径下配置一个属性文件,config.properties,内容如下: Java代码   driverClass=xxx jdbcUrl=xxx user=xxx p

数据库连接池C3P0学习

数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. 一.实现方式: C3P0有三种方式实现: 1.自己动手写代码,实现数据源 例如:在类路径下配置一个属性文件,config.properties,内容如下: driverClass=xxx jdbcUrl=xxx user=xxx password=xxx ... 然后代码中实现 Properties props = new Properties(); InputStream i

JAVA JDBC 数据库连接池

1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接 进行sql操作 断开数据库连接 这种模式开发,存在的问题: 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s-1s的时间).需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接.这样的方式将会消耗大量的资

开源框架数据库连接池dbcp的使用方法

package com.mysql.demo; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; //运用开源数据库连接池DBCP //引用dbcp.j

在Java中开源的数据库连接池

在Java中开源的数据库连接池有以下几种 : 1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象. https://github.com/swaldman/c3p0 2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的移植到现存的代码中.完全可配

Spring Boot [使用 Druid 数据库连接池]

导读 最近一段时间比较忙,以至于很久没有更新Spring Boot系列文章,恰好最近用到Druid, 就将Spring Boot 使用 Druid作为数据源做一个简单的介绍. Druid介绍: Druid是阿里巴巴开源的数据库连接池,Druid号称是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能,Druid的官方地址 了解更多: JDBC连接池.监控组件 Druid (oschina) 快速上手: 下面来说明如何在 spring Boot 中配置使用Druid ,本例使用的持