阿里巴巴的开源项目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语句数量
配置时只需要按照上边注释以外的内容配置便可,这是我的配置文件信息
注意: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语句查询数据库数据,扩展便可以。