Druid(德鲁伊)数据池配置文件详解以及简单的实现

阿里巴巴的开源项目Druid数据池目前来讲还是很流行的,性能也比较好,接下来简单介绍一下它的几点优势

一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习

搭建Druid数据池,需要导入两个包

druid-1.1.5.jar mysql-connector-java-5.1.41-bin.jar

包导入完成后,是Druid的配置。有两种方式,一种是一步一步自己手动去配(硬编码),另一种是通过properties文件配置(软编码)。
这两种方式都可以配置Druid,但是第一种硬编码方式不够灵活,耦合性也高,如果日后我们需要修改配置信息,还需要重新编译,很麻烦,而如果我们选择第二种软编码方式,日后需求出现变动只需要修改这个配置文件便行,可维护性高,所以一般选择第二种,接下来先介绍第二种配置方式。
首先在src目录下新建一个druid.properties配置文件,然后在这个文件中封装配置信息,以下是配置内容详解

driverClassName=com.mysql.jdbc.Driver //驱动加载
url=jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8 //注册驱动
username=root //连接数据库的用户名
password=sjw58586 //连接数据库的密码。
filters=stat //属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall
initialSize=2 //初始化时池中建立的物理连接个数。
maxActive=300 //最大的可活跃的连接池数量
maxWait=60000 //获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
timeBetweenEvictionRunsMillis=60000 // 连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1 //用来检测连接是否有效的sql,要求是一个查询语句。
testWhileIdle=true //建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。
testOnBorrow=false //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false
testOnReturn=false //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase
poolPreparedStatements=false //是否缓存preparedStatement,也就是PSCache。
maxPoolPreparedStatementPerConnectionSize=200 // 池中能够缓冲的preparedStatements语句数量

配置时只需要按照上边注释以外的内容配置便可,这是我的配置文件信息
Druid(德鲁伊)数据池配置文件详解以及简单的实现_第1张图片

注意:properties配置文件不能有空格,值不能有双引号,行不能写分号
配置文件配好之后,就可以开始初始化数据池子了

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

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

public class DataSourceUtil {

    static DruidDataSource dSource = null;
    static Properties properties = new Properties();

    // 静态代码块初始化加载驱动
    static {
        // 通过类加载器来获得流
        InputStream is = DataSourceUtil.class.getClassLoader().getResourceAsStream("Druid.properties");
        try {
            // 通过流读取配置文件中的内容到集合中
            properties.load(is);
            // 通过Druid工厂加载文件注册驱动,初始化池子
            dSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 测试连接是否正常
        for (int i = 0; i < 50; i++) {
            try {
                // 从池中取出连接
                Connection conn = dSource.getConnection();
                System.out.println(conn.hashCode());
                // 使用完后将连接放入池中(close()是代理过的方法,并不是原生的colse)
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

第二种配置方式:

public class Demo1 {
    public static void main(String[] args) throws Exception{
        //创建连接池
        DruidDataSource ds=new DruidDataSource();
        //1基本参数4个
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/school");
        ds.setUsername("root");
        ds.setPassword("root");

        //2其他配置
        //2.1设置初始大小
        ds.setInitialSize(20);
        //2.2设置最大大小
        ds.setMaxActive(50);
        //2.3设置最小空闲连接
        ds.setMinIdle(5);
        //2.4设置等待时间
        ds.setMaxWait(10000);

        // 测试连接是否正常
        for(int i=0;i<100;i++) {
            Connection conn=ds.getConnection();
            System.out.println(conn.getClass().getName()+"..."+i);
            conn.close();
        }       
    }
}   

ok,两种方式都完成了配置,最后都打印出了连接池中连接的hascode(),证明正确,如果有需要,还可以再加入一些sql语句查询数据库数据,扩展便可以。

你可能感兴趣的:(Druid(德鲁伊)数据池配置文件详解以及简单的实现)