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服务器:
打开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
|