不止于数据库连接池的Druid

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

准备环境

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

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

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

docker exec -it mysql mysql -uroot -p123456

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

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打开:

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

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

各种监控

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

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监控,参数的具体配置可以参考 这里

<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 里加入以下配置来启用简单的登录功能:

<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 里这样配:

log4j.logger.druid.sql=debug,stdout

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

{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
我来评几句
登录后评论

已发表评论数()

相关站点

热门文章