文章目录
Tomcat配置druid有两种配置方式
- tomcat中植入
应用无需关心druid的配置 - 项目应用中依赖
应用来管理druid的配置
1. TOMCAT中植入
1.1. Tomcat依赖修改
下载druid的依赖jar,放入到tomcat/lib目录下。
有的应用可能内部有可能使用tomcat的dbcp配置,可以选择删除lib下的tomcat-dbcp.jar
概述步骤如下:
- /home/tomcat/apache-tomcat-8.5.31/lib
- 删除tomcat-dbcp.jar
- 追加druid-1.1.9.jar
- 改Tomcat web.xml配置
- 改Tomcat context.xml配置
- 检查项目中是否有权限拦截的,需要放开拦截,改项目的web.xml
- 如果druid没加载上,再改catalina.properties
- 验证地址: {ip}:{host}/{project_name}/druid/login.html
1.2. Tomcat配置
1.2.1. web.xml配置
修改tomcat下的web.xml,里面增加druid配置:
以下内容增加在web.xml中的servlet的default配置后面。
<!-- druid view -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>admin</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- druid view -->
以下内容增加在Built In Filter Definitions注释下面。
<!-- 连接池 启用 Web 监控统计功能 start-->
<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 ,*.map,/druid/*</param-value >
</init-param >
<init-param>
<param-name>sessionStatMaxCount</param-name>
<param-value>2000</param-value>
</init-param>
<init-param>
<param-name>sessionStatEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>principalSessionName</param-name>
<param-value>session_user_key</param-value>
</init-param>
<init-param>
<param-name>profileEnable</param-name>
<param-value>true</param-value>
</init-param>
</filter >
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name >
<url-pattern>/*</url-pattern >
</filter-mapping >
<!-- 连接池 启用 Web 监控统计功能 end-->
1.2.2. context.xml配置
只需要将source中的factory修改为:com.alibaba.druid.pool.DruidDataSourceFactory
参考配置如下:
<Resource name="prpDataSource"
auth="Container"
type="javax.sql.DataSource"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
defaultTransactionIsolation="READ_COMMITTED"
username="用户名"
password="密码"
filters="stat,wall"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@ip:端口:service"
maxActive="96"
minIdle="8"
removeabandoned="true"
removeabandonedtimeout="60"
logabandoned="true">
</Resource>
1.3 如果druid没加载上,再改catalina.properties
* catalina.properties
* 增加druid-1.1.9.jar
1.4. 项目web.xml配置
检查项目中是否有对html、css、js以及地址的拦截,如果涉及权限部分需要放开或者增加用户访问权限。
2. 项目中增加依赖
2.1. 依赖引入
如果之前使用dbcp系列数据源的,需要增加以下配置:
<dependency>
<groupId>com.alibaba.druid</groupId>
<artifactId>druid-wrapper</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
由于druid依赖log4j,项目中没有引入log4j的,需要引入log4j。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.8</version>
</dependency>
注意:以上顺序要保证wrapper在上面!
注意:pom中需要解决jar包冲突问题!
注意:有的应用可能内部有可能使用tomcat的dbcp配置,可以选择删除lib下的tomcat-dbcp.jar
2.2. 数据源配置
在tomcat的context的配置调整如下:
<Resource name="prpDataSource"
auth="Container"
type="javax.sql.DataSource"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
defaultTransactionIsolation="READ_COMMITTED"
username="用户名"
password="密码"
filters="stat,wall"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@ip:端口:service"
maxActive="96"
minIdle="8"
removeabandoned="true"
removeabandonedtimeout="60"
logabandoned="true">
</Resource>
2.3. web.xml配置
在web.xml顶部增加以下配置:
<!--Oracle数据库JNDI数据源引用 -->
<resource-ref>
<description>Oracle DB Connection</description>
<res-ref-name>jdbc/OracleDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在web.xml的filter第一行增加以下配置:
<!-- 连接池 启用 Web 监控统计功能 start-->
<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 ,*.map,/druid/*</param-value >
</init-param >
<init-param>
<param-name>sessionStatMaxCount</param-name>
<param-value>2000</param-value>
</init-param>
<init-param>
<param-name>sessionStatEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>principalSessionName</param-name>
<param-value>session_user_key</param-value>
</init-param>
<init-param>
<param-name>profileEnable</param-name>
<param-value>true</param-value>
</init-param>
</filter >
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name >
<url-pattern>/*</url-pattern >
</filter-mapping >
<!-- 连接池 启用 Web 监控统计功能 end-->
在web.xml的selvlet第一行增加以下配置:
<!-- druid view -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>admin</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- druid view -->
项目中的web.xml
如果项目中有使用Authorization权限拦截的,需要在白名单中配置/druid/路径:
<filter>
<filter-name>Authorization</filter-name>
<filter-class>
com.sinosoft.common.AuthorizationFilter
</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/index.html</param-value>
</init-param>
<init-param>
<param-name>valid</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>
/login.do;
/claim/swfFlowBeforeQuery.do;
/interFaces/;
/prpall/;
/www/;
/druid/;
</param-value>
</init-param>
</filter>
注意:web.xml有加载顺序,所以一定要按照顺序配置!
3. 页面访问
3.1. 登陆界面
{ip}:{host}/{project_name}/druid/login.html
示例图:
用户名密码,请参考web.xml中的loginUsername属性
3.2. 首页
示例图:
3.3. 数据源页面
不一一截图了,首页里得菜单大家可以挨个看看
注意:页面不展示时,可能由于你的配置有问题,可能出现jar包冲突、数据源未加载或者被其他拦截器给重定向到其他页面!
4. 官方资料
5. 需要关注的源码类
DruidDataSourceFactory
//这里面有属性值,忘记的时候可以记得上这里面找 官网资料更详细一些
//关于事务等级的配置,也可以找到
示例图1,常用属性:
示例图2,事务隔离级别:
6. 常见问题
- jar冲突,可以通过idea的maven helper插件来解决,如果是eclipse,可以在maven工具里找到红色线条进行移除
- 加载顺序问题,可以多次调整顺序进行测试。这里建议启动的时候不用过idea启动,直接通过tomcat启动。
- 页面访问不到问题,优先排查filter拦截器是否被拦截,再在源码中打断点,关注源码是否被加载和访问。
- idea启动tomcat,配置未生效,需要在service界面中,右键点击tomcat,选择clear centent。然后再启动。
7. 使用Druid对数据库密码加密
- 使用以下命令生成加密数据:
java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 密码
会生成以下结果:
privateKey: MIIBVAIBAD。。。省略。。。7kpLdvm60qdDnQ=
publicKey: MFwwDQYJ。。。省略。。。CAwEAAQ==
password: DF8Xj。。。省略。。。bg==
只需要保存下来password和publicKey即可。
将password配置到数据源的password属性,将publicKey配置到数据源的config.decrypt.key属性上。具体可参考下文中的tomcat配置和spring项目配置。
7.1 tomcat项目配置不使用加密配置
<Resource name="prpDataSource"
auth="Container"
type="javax.sql.DataSource"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
username="userName"
password="passWrod"
maxWait="20000"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@ip:host:serviceName"
maxActive="96"
minIdle = "8"
testWhileIdle="true"
testBetweenConnectErrorMillis="60000"
minEvictableIdleTimeMillis: 30000
removeabandoned="true"
removeabandonedtimeout="60"
poolPreparedStatements="false"
maxPoolPreparedStatementPerConnectionSize="0"
useGlobalDataSourceStat="false"
testOnBorrow="false"
testOnReturn="false"
validationQuery="SELECT 1 FROM DUAL"
initialSize="1"
logabandoned="true"
filters="stat,wall"
connectionProperties="useUnicode=true;characterEncoding=UTF-8;autoReconnect=true;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;useSSL=false></Resource>
7.2使用加密配置
<Resource name="prpDataSource"
auth="Container"
type="javax.sql.DataSource"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
username="htyw_new"
password="DF8XjS。。。省略。。。VrmDcFyLbW8bg=="
maxWait="20000"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@ip:host:serviceName"
maxActive="96"
minIdle = "8"
testWhileIdle="true"
testBetweenConnectErrorMillis="60000"
minEvictableIdleTimeMillis: 30000
removeabandoned="true"
removeabandonedtimeout="60"
poolPreparedStatements="false"
maxPoolPreparedStatementPerConnectionSize="0"
useGlobalDataSourceStat="false"
testOnBorrow="false"
testOnReturn="false"
validationQuery="SELECT 1 FROM DUAL"
initialSize="1"
logabandoned="true"
filters="config,stat,wall"
connectionProperties="useUnicode=true;characterEncoding=UTF-8;autoReconnect=true;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;useSSL=false;config.decrypt=true;config.decrypt.key=MFwwDQ。。。省略。。。AwEAAQ==">
</Resource>
7.3 spring项目配置不使用加密配置
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://ip:host/name?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 连接池的配置信息
# 初始化时建立物理连接的个数 initial-size: 3
# 连接池最小连接数 min-idle: 3
# 连接池最大连接数 max-active: 20
# 获取连接时最大等待时间,单位毫秒 max-wait: 60000
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 test-while-idle: true
# 既作为检测的间隔时间又作为testWhileIdel执行的依据 time-between-connect-error-millis: 60000
# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接 min-evictable-idle-time-millis: 30000
# 用来检测连接是否有效的sql 必须是一个查询语句
# mysql中为 select 'x'
# oracle中为 select 1 from dual validation-query: select 'x'
# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true test-on-borrow: false
# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true test-on-return: false
# 是否缓存preparedStatement,mysql5.5+建议开启 pool-prepared-statements: true
# 当值大于0时poolPreparedStatements会自动修改为true max-pool-prepared-statement-per-connection-size: 20
# 合并多个DruidDataSource的监控数据 use-global-data-source-stat: false
# 配置扩展插件 filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 定时输出统计信息到日志中,并每次输出日志会导致清零(reset)连接池相关的计数器。 time-between-log-stats-millis: 300000
# 配置DruidStatFilter web-stat-filter: enabled: true url-pattern: '/*' exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
# 配置DruidStatViewServlet stat-view-servlet:
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全) enabled: true url-pattern: '/druid/*'
# IP白名单(没有配置或者为空,则允许所有访问) allow: ip1,ip2
# IP黑名单 (存在共同时,deny优先于allow) deny: ip
# 禁用HTML页面上的“Reset All”功能 reset-enable: false
# 登录名 login-username: admin
# 登录密码 login-password: admin
7.4 使用加密配置
同理换密文即可