文章目录
  1. 1. 准备环境
  2. 2. 各种监控
  3. 3. 其它功能
    1. 3.1. 登录
    2. 3.2. 日志

Druid传说中是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能,甚至可以基于SQL语义来防御SQL注入攻击。它与其它数据库连接池的功能对比可以参考各种数据库连接池对比,性能对比可以参考各种连接池性能对比测试。网上的一些原code.alibabatech.com的链接已经失效,文档都转移到了github上,以wiki+FAQ的方式提供,查起来有些混乱。下面我们来动手了解一下druid所提供的功能。

准备环境

既然是数据库连接池,首先要启动一个数据库。用docker来弄简单轻松:

1
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --net=host --name=mysql mysql:5.7.12

进入容器并连接上数据库:

1
docker exec -it mysql mysql -uroot -p123456

创建用户表并插入一些初始数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE DATABASE spike;
USE spike;
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
gender TINYINT NOT NULL,
birthday TIMESTAMP NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO user(name, gender, birthday) VALUES('ggg', '1', '1999-01-01');
INSERT INTO user(name, gender, birthday) VALUES('Loic', '1', '2000-01-01');
INSERT INTO user(name, gender, birthday) VALUES('Hetty', '2', '2001-01-01');
SELECT * FROM user;
exit

我在github上创建了一个druid的maven版测试工程,下载到本地并使用自己喜欢的IDE打开:

1
git clone https://github.com/qinghua/druid

然后打开spring-context-dao.xml文件,把数据源从jdbc:mysql://192.168.33.88:3306/spike替换为自己的本地数据源。

各种监控

以下命令可以直接启动jetty服务器:

1
2
cd druid
mvn jetty:run

打开http://localhost:8080/hello?id=1便能看见Hello ggg,这个是程序的正常功能。

Druid的页面是通过在web.xml里配置DruidStatView的servlet来实现的。参数的具体配置可以参考这里。打开http://localhost:8080/druid/index.html便能看见druid的首页了:

如果刚才访问过hello,通过点击数据源便能查看到程序新创建的数据源。可以在IDE里打开spring-context-dao.xml通过dataSource来查看数据源的配置,参数的具体配置可以参考这里。通过class="com.alibaba.druid.pool.DruidDataSource"来使用druid。点击SQL监控便能体会到druid引以为傲的强大监控功能:

SQL防火墙是用来防止SQL注入的,配置可以参考这里。还可以通过在web.xml加入以下配置来启用web监控,参数的具体配置可以参考这里

1
2
3
4
5
6
7
8
9
10
11
12
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

除了监控SQL和web,druid还能监控spring的一些调用信息。可以在IDE里打开spring-context-druid.xml查看程序的当前配置。参数的具体配置可以参考这里。通过点击spring监控便能查看到方法的调用时间和jdbc的一些状态:

其它功能

登录

监控里显示的都是敏感信息,可以通过在web.xml里加入以下配置来启用简单的登录功能:

1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>loginUsername</param-name>
<param-value>ggg</param-value>
</init-param>
<init-param>
<param-name>loginPassword</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>

这样访问druid界面的时候就需要输入用户名密码啦:

日志

如果想在日志里看到执行的sql,可以根据这里的说明来配置。Druid支持多种日志组件。显示执行的sql是debug级别,如果用的是log4j,可以在log4j.properties里这样配:

1
log4j.logger.druid.sql=debug,stdout

访问hello页面,便可以看到如下日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{conn-10005} connected
{conn-10005} pool-connect
{conn-10005, pstmt-20000} created.
SELECT name FROM user WHERE id=?
{conn-10005, pstmt-20000} Parameters : [2]
{conn-10005, pstmt-20000} Types : [INTEGER]
{conn-10005, pstmt-20000} executed. 1.351044 millis.
SELECT name FROM user WHERE id=?
{conn-10005, pstmt-20000, rs-50000} open
{conn-10005, pstmt-20000, rs-50000} Header: [name]
{conn-10005, pstmt-20000, rs-50000} Result: [Loic]
{conn-10005, pstmt-20000, rs-50000} closed
{conn-10005, pstmt-20000} clearParameters.
{conn-10005} pool-recycle

文章目录
  1. 1. 准备环境
  2. 2. 各种监控
  3. 3. 其它功能
    1. 3.1. 登录
    2. 3.2. 日志