参考博客:https://github.com/yjmyzz/spring-mybatis-multidatasource
http://www.cnblogs.com/dream-to-pku/p/6367396.html
http://itindex.net/detail/50100-druid
http://blog.csdn.net/yingxiake/article/details/51274426
http://www.cnblogs.com/wuyun-blog/p/5679073.html
http://www.cnblogs.com/plan123/p/5652384.html
http://blog.csdn.net/sdmxdzb/article/details/51096752
http://www.cnblogs.com/wuyun-blog/p/5674244.html
1.版本:
<!-- druid 版本号 -->
<druid.version>1.0.29</druid.version>
<!--日志 s-->
<logback.version>1.2.3</logback.version>
<slf4j.version>1.7.7</slf4j.version>
<!--日志 s-->
2.logback.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL --> <!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 --> <!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 --> <!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 --> <!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 动态日志级别 --> <jmxConfigurator/> <!-- 定义日志文件 输出位置 --> <property name="log_dir" value="c:/log"/> <!-- 日志最大的历史 30天 --> <property name="maxHistory" value="30"/> <!--<!– ConsoleAppender 控制台输出日志 –>--> <!--<appender name="console" class="ch.qos.logback.core.ConsoleAppender">--> <!--<encoder>--> <!--<pattern>--> <!--<!– 设置日志输出格式 –>--> <!--%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n--> <!--</pattern>--> <!--</encoder>--> <!--</appender>--> <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <Encoding>UTF-8</Encoding> <!-- 日志输出格式:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符 --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </layout> </appender> <!-- ERROR级别日志 --> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录WARN级别的日志 --> <!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置过滤级别 --> <level>ERROR</level> <!-- 用于配置符合过滤条件的操作 --> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合过滤条件的操作 --> <onMismatch>DENY</onMismatch> </filter> <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志输出位置 可相对、和绝对路径 --> <fileNamePattern> ${log_dir}/error/%d{yyyy-MM-dd}/error-log.log </fileNamePattern> <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 --> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern> <!-- 设置日志输出格式 --> %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n </pattern> </encoder> </appender> <!-- WARN级别日志 appender --> <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录WARN级别的日志 --> <!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置过滤级别 --> <level>WARN</level> <!-- 用于配置符合过滤条件的操作 --> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合过滤条件的操作 --> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志输出位置 可相对、和绝对路径 --> <fileNamePattern>${log_dir}/warn/%d{yyyy-MM-dd}/warn-log.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern> </encoder> </appender> <!-- INFO级别日志 appender --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}/info-log.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern> </encoder> </appender> <!-- DEBUG级别日志 appender --> <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log_dir}/debug/%d{yyyy-MM-dd}/debug-log.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern> </encoder> </appender> <!-- TRACE级别日志 appender --> <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>TRACE</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log_dir}/trace/%d{yyyy-MM-dd}/trace-log.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern> </encoder> </appender> <!-- root级别 DEBUG --> <root> <!-- 打印debug级别日志及以上级别日志 --> <level value="debug"/> <!-- 控制台输出 --> <appender-ref ref="console"/> <!-- 文件输出 --> <appender-ref ref="ERROR"/> <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <appender-ref ref="DEBUG"/> <appender-ref ref="TRACE"/> </root> </configuration>
3.applicationContext-beans.xml
<!-- 1. 加载数据库配置的属性文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:/druid.properties</value> </list> </property> </bean> <!--2. 数据源dataSource--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init"> <!-- 数据库基本信息配置 --> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <property name="driverClassName" value="${driverClassName}"/> <!-- 最大并发连接数 --> <property name="maxActive" value="${maxActive}"/> <!-- 初始化连接数量 --> <property name="initialSize" value="${initialSize}"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="${maxWait}"/> <!-- 最小空闲连接数 --> <property name="minIdle" value="${minIdle}"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/> <property name="validationQuery" value="${validationQuery}"/> <property name="testWhileIdle" value="${testWhileIdle}"/> <property name="testOnBorrow" value="${testOnBorrow}"/> <property name="testOnReturn" value="${testOnReturn}"/> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true"/> <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/> <!-- 打开 removeAbandoned 功能 --> <property name="removeAbandoned" value="${removeAbandoned}"/> <!-- 1800 秒,也就是 30 分钟 --> <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/> <!-- 关闭 abanded 连接时输出错误日志 --> <property name="logAbandoned" value="${logAbandoned}"/> <property name="filters" value="${filters}"/> <!-- 解密密码必须要配置的项 --> <!--<property name="filters" value="config" />--> <!--<property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publicKey}" />--> <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 --> <property name="defaultAutoCommit" value="true"/> <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> <property name="proxyFilters"> <list> <ref bean="logFilter"/> </list> </property> </bean> <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="statementExecutableSqlLogEnable" value="false"/> </bean>
注意: 当用密码加密时,
<property name="filters" value="config" />
此时的,sql监测时无效的;
4.druid.properties
url:jdbc:oracle:thin:@127.0.0.1:1521:ORCL driverClassName:oracle.jdbc.driver.OracleDriver username:user_lpj_jk #publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANllcuFVnNZcdh0N/ZaowiQGqe6+9JGh/D6mzJ8g7C2GHjGVmmcUo7btUWj/y9ZqYO7uu518KCa6wjfRHwDMl38CAwEAAQ== #password:m5DQdPjy25cTIJbNjusmbZ1CVGIcKQ2USgAy5LGIQrNdkxiqN27cEb2qSlm1i5wzoVFWUPZx/rV+EttH4tHtlA== filters:stat #监控统计用的filter:stat #日志用的filter:log4j #防御sql注入的filter:wall maxActive:20 initialSize:1 maxWait:60000 minIdle:10 #maxIdle:15 timeBetweenEvictionRunsMillis:60000 minEvictableIdleTimeMillis:300000 validationQuery:select 1 from dual #validationQuery:SELECT 'x' testWhileIdle:true testOnBorrow:false testOnReturn:false #poolPreparedStatements:true maxOpenPreparedStatements:20 removeAbandoned:true removeAbandonedTimeout:1800 logAbandoned:true
注意:oracle 为 validationQuery:select 1 from dual