一、德鲁伊(Druid)连接池的优势
1.Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
2.Druid连接池是[阿里巴巴内部唯一使用的连接池],在内部数据库相关中间件TDDL/DRDS 都内置使用强依赖了Druid
连接池,经过阿里内部数千上万的系统大规模验证,[经过历年双十一超大规模并发验证]。
3.它有贴心的错误提示——当连接不够用时,申请链接超时报错,Druid连接池能够报错会告诉你当前RunningSQL
有哪些,当前连接池的水平信息。通过错误日志很方便知道系统瓶颈在哪里。
4.Druid连接池最初就是为监控系统采集jdbc运行信息而生的,它内置了StatFilter 功能,能采集非常完备的连接
池执行信息Druid连接池内置了能和Spring/Servlet关联监控的实现,使得监控Web应用特别方便Druid连接池内置了一个监控页面,提供了非常完备的监控信息,可以快速诊断系统的瓶颈。
5. 监控不影响性能——Druid增加StatFilter之后,能采集大量统计信息,同时对性能基本没有影响。StatFilter对CPU和内存的消耗都极小,对系统的影响可以忽略不计。监控不影响性能是Druid连接池的重要特性。
6. SQL参数化合并监控——实际业务中,如果SQL不是走PreparedStatement,SQL没有参数化,这时SQL需要参数化
合并监控才能真实反映业务情况。如下SQL:
select * from t where id = 1
select * from t where id = 2
select * from t where id = 3
参数化后:
select * from t where id = ?
参数化合并监控是基于SQL Parser语法解析实现的,是Druid连接池独一无二的功能。
7.执行次数、返回行数、更新行数和并发监控——StatFilter能采集到每个SQL的执行次数、返回行数总和、更新
行数总和、执行中次数和和最大并发。并发监控的统计是在SQL执行开始对计数器加一,结束后对计数器减一实现
的。可以采集到每个SQL的当前并发和采集期间的最大并发。
8.防SQL注入
SQL注入攻击是黑客对数据库进行攻击的常用手段,Druid连接池内置了WallFilter 提供防SQL注入功能,在不影响性能的同时防御SQL注入攻击。
8.1 基于语意的防SQL注入
Druid连接池内置了一个功能完备的SQL Parser,能够完整解析mysql、sql server、oracle、postgresql的语法,
通过语意分析能够精确识别SQL注入攻击。
8.2 极低的漏报率和误报率
基于SQL语意分析,大量应用和反馈,使得Druid的防SQL注入拥有极低的漏报率和误报率。
8.3 防注入对性能影响极小
内置参数化后的Cache、高性能手写的Parser,使得打开防SQL注入对应用的性能基本不受影响。
二、如何使用德鲁伊连接池
通过Druid配置文件使用:
1. 创建lib目录,导入Druid的jar 包,并把jar包添加到项目库(右键lib目录->Add as Library->ok)
2. 创建一个名为druid.properties的文件(配置文件看第三点),拷贝配置文件到src目录
3. 根据配置文件创建Druid连接池对象
4. 从Druid连接池对象获得Connection
相关jar包链接:https://pan.baidu.com/s/1gyoVTIseRT02A0tEdhabHg?pwd=vznt
提取码:vznt
三、配置文件
配置文件名:druid.properties
# 数据库连接参数
url=jdbc:mysql://localhost:3306/[这里输入数据库文件名路径]
username=[这里输入数据库用户名]
password=[这里输入数据库密码]
driverClassName=com.mysql.jdbc.Driver//驱动
# 连接池的参数
initialSize=10//初始化连接数
maxActive=10//最大最大活动连接数
maxWait=2000//最大等待时间
四、使用德鲁伊:druid底层是使用的工厂设计模式,去加载配置文件
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
//定义成员变量DataSource
private static DataSource ds;
static {
//加载配置文件
Properties pro = new Properties();
try {
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//获取Datasource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(ResultSet rs,Statement stmt, Connection conn) throws SQLException {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
if (rs != null) {
rs.close();
}
}
public static DataSource getDataSource(){
return ds;
}
}
五、准备一张数据库表
六、创建jdbcTemplateDemo类修改数据库
import org.springframework.jdbc.core.JdbcTemplate;
public class jdbcTemplateDemo {
public static void main(String[] args) {
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
String sql="update dept set loc='南昌' where deptno =? ";
int count = template.update(sql, 40);
System.out.println(count);
}
}
七、运行Java程序,修改数据库表
可以看到,数据库表修改成功!