做爲程序員,開發工程中,一套利於測試或者監控的工具很重要,mybatis默認沒有提供log4j的打印sql語句的配置。css
這對於開發rest服務,提供接口的開發者而言,是在很很差作,再加上mybatis很靈活,使用腳本動態生成sql語句,所以,有時候真不知道運行的sql是否是咱們所指望的,過濾的條件是否起做用。java
所幸,德魯伊監控平臺是個不錯的選擇,在性能方面druid鏈接池也比spring原生的要好,所以也是不少企業開發的首選數據源配置。mysql
在引言階段,咱們先看看目前我配置的結果是不是你想要的,若是不是你所指望的,就別浪費時間往下面看,畢竟你們都時間有限,不必花費時間看一些對本身沒用的東西。git
控制檯打印的日誌,慎重的告訴你,這種大量打印信息不能用於生產壞境,生產環境中這些信息寫到tomcat的日誌文件中了{tomcat的目錄}/logs/catalina.out
,若是訪問量很大的時候,一天產生幾個GB的日誌不是問題--慎用。程序員
[03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Connection: {conn-10001} pool-connect [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Statement: {conn-10001, pstmt-20025} created. select * from t_login_register_st WHERE 1 = 1 and ltime >= ? order by ltime desc limit ?, ? [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Statement: {conn-10001, pstmt-20025} Parameters : [1463414400, 0, 15] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Statement: {conn-10001, pstmt-20025} Types : [BIGINT, INTEGER, INTEGER] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Statement: {conn-10001, pstmt-20025} executed. 6.503031 millis. select * from t_login_register_st WHERE 1 = 1 and ltime >= ? order by ltime desc limit ?, ? [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} open [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Header: [ltime, login_register, register, register_sent_code, register_edit, register_edit_publish, register_edit_succ, login, foget_passwd, foget_passwd_sent_code, login_succ, login_fail, login_succ_normal, login_succ_qq, login_succ_wx, login_succ_wb, login_succ_foget_passwd, login_fail_normal, login_fail_qq, login_fail_wx, login_fail_wb, login_fail_foget_passwd] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464624000, 604, 216, 117, 113, 109, 106, 931, 59, 9, 790, 150, 279, 148, 254, 93, 32, 117, 9, 26, 2, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464537600, 639, 241, 132, 125, 121, 114, 998, 40, 11, 844, 130, 312, 168, 268, 87, 24, 107, 5, 18, 2, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464451200, 674, 322, 175, 170, 160, 155, 1087, 46, 11, 923, 143, 310, 164, 339, 96, 26, 114, 6, 25, 3, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464364800, 794, 371, 187, 182, 168, 162, 1330, 73, 17, 1153, 178, 307, 257, 455, 120, 34, 137, 11, 25, 6, 3] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464278400, 670, 295, 169, 162, 154, 118, 1197, 88, 12, 977, 229, 338, 185, 320, 120, 33, 135, 33, 54, 25, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464192000, 709, 308, 172, 163, 159, 120, 1214, 56, 8, 1065, 292, 383, 196, 349, 122, 30, 148, 54, 78, 30, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464105600, 666, 285, 153, 148, 141, 139, 1120, 75, 14, 970, 159, 328, 188, 294, 141, 38, 132, 11, 14, 3, 0] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1464019200, 586, 254, 146, 141, 136, 132, 1018, 60, 12, 884, 132, 307, 149, 295, 124, 31, 108, 3, 18, 3, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463932800, 548, 209, 110, 106, 106, 103, 910, 68, 13, 779, 135, 306, 123, 251, 87, 33, 120, 4, 14, 1, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463846400, 520, 197, 104, 100, 99, 94, 963, 46, 12, 827, 132, 289, 149, 261, 110, 26, 110, 4, 13, 5, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463760000, 627, 237, 142, 134, 129, 122, 1190, 80, 23, 999, 173, 348, 182, 304, 137, 45, 137, 11, 22, 3, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463673600, 678, 280, 150, 144, 133, 128, 1235, 75, 8, 1012, 184, 354, 187, 342, 126, 28, 153, 14, 16, 6, 1] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463587200, 564, 230, 138, 135, 131, 126, 1063, 53, 11, 901, 122, 337, 161, 274, 116, 27, 102, 3, 15, 3, 4] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463500800, 552, 212, 119, 112, 108, 106, 986, 46, 6, 833, 134, 332, 146, 254, 92, 23, 122, 6, 5, 1, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} Result: [1463414400, 665, 234, 130, 124, 125, 121, 1165, 65, 13, 979, 159, 409, 143, 303, 116, 33, 145, 4, 6, 3, 2] [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.ResultSet: {conn-10001, pstmt-20025, rs-50025} closed [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Statement: {conn-10001, pstmt-20025} closed [03/06/16 11:56:03:003 CST] http-nio-8080-exec-2 DEBUG sql.Connection: {conn-10001} pool-recycle
德魯伊監控平臺的視圖:github
圖一 SQL監控web
圖二 URI監控spring
重要的話,重複一遍,若是目前所寫對如今的你沒用,就算之後可能會用到,你也不必細看下面所述,到此你已經花費了不少時間了,時間是金錢,傷不起。sql
若是你堅持要看到這裏,請收藏吧!數據庫
其實與spring的配置基本沒多大關係,可是由於其加載了數據庫的基本信息,因此兩個合在一塊兒看一下。
spring-applicationContext.xml的部分配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd "> <task:annotation-driven/> <context:annotation-config/> <context:component-scan base-package="cn.test.*"/> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> <property name="ignoreResourceNotFound" value="true"/> <property name="locations"> <list> <!-- 越靠後越有效,取到最後一個有效的未知 --> <value>classpath:conf/properties/*.properties</value> </list> </property> </bean> </beans>
properties文件的部分配置:
mysql.host=127.0.0.1 #你的數據庫主機 mysql.port=3306 mysql.database=test # 你的數據庫 mysql.user=test # 數據庫登陸用戶 mysql.pwd=123456 # 數據庫登陸密碼
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 開啓事務註解驅動,管理事務--> <tx:annotation-driven transaction-manager="txManager"/> <!-- 在dao層可使用@Trantional註解管理事務,spring會將註解了事務的類中的全部操做視爲事務來管理 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"/> </bean> <!-- ******前面的這些都是今天的重點,下面是重點的開始,咱們配置的數據源是德魯伊druid數據源,這個纔是重點****** --> <!-- ========================================================--> <!-- 使用druid做爲數據源鏈接池--> <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" > <!-- 數據庫的配置,host:主機名,port:端口,database:數據庫 --> <property name="url" value="jdbc:mysql://${mysql.host}:${mysql.port}/${mysql.database}?characterEncoding=utf8" /> <!-- 鏈接數據的用戶名--> <property name="username" value="${mysql.user}" /> <!-- 鏈接數據庫的密碼--> <property name="password" value="${mysql.pwd}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置獲取鏈接等待超時的時間 --> <property name="maxWait" value="30000" /> <!-- 配置間隔多久才進行一次檢測,檢測須要關閉的空閒鏈接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個鏈接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <!-- 這裏建議配置爲TRUE,防止取到的鏈接不可用 --> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="false" /> <!-- 打開PSCache,而且指定每一個鏈接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <!-- 驗證鏈接有效與否的SQL,不一樣的數據配置不一樣 --> <property name="validationQuery" value="select 1 " /> <!-- ******重要的配置:監控統計攔截的filters,日誌記錄 *start* ******--> <!-- 並在filters屬性中配置了log4j,ref中的bean是下面攔截器的配置 --> <!-- proxyFilters和filters是組合關係,前者是根據bean配置,後者根據別名配置的--> <!-- stat是statfilter的別名,log4j是logFilter的別名--> <!-- 監控統計攔截的filters,日誌記錄,這裏開啓了stat,wall(sql翻過牆過濾監控),log4j(log4j的監控)配置 --> <property name="proxyFilters"> <list> <ref bean="statfilter" /> <ref bean="logFilter" /> </list> </property> <property name="filters" value="wall" /> <!-- *end* --> </bean> <!-- 慢SQL記錄 *start* --> <bean id="statfilter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 開啓合併sql --> <property name="mergeSql" value="true" /> <!-- 開啓慢查詢語句,1秒 --> <property name="slowSqlMillis" value="1000" /> <property name="logSlowSql" value="true" /> </bean> <bean id="logFilter" class="com.alibaba.druid.filter.logging.Log4jFilter"> <!-- <property name="resultSetLogEnabled" value="false" /> --> <!-- <property name="statementExecutableSqlLogEnable" value="true" /> --> </bean> <!-- 慢SQL記錄 *end* --> <!-- ========================================================--> <!-- 事務加強,這裏用的是spring提供的特性--> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="select*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="has*" read-only="true"/> <tx:method name="count*" read-only="true"/> <tx:method name="search*" read-only="true"/> </tx:attributes> </tx:advice> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="datasource"/> </property> </bean> <!-- Session Factory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <!-- 下面configLocation這一句是myabtis的其它配置,好比字段值爲null的時候,該字段就不返回了,在實際應用中,若是沒有其它配置,能夠刪掉了--> <property name="configLocation" value="classpath:META-INF/spring/configuration.xml"/> <!--<property name="mapperLocations" value="classpath:mapper/*mapper.xml"/>--> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> <property name="basePackage" value="cn.test.web.mapper"/> </bean> </beans>
上面的配置中,使用<!-- ====== -->
包裹的部分時今天配置的重點,其它的配置時開發中的基本配置,也就是說基本的必須配置,不配置不能使用到spring提供的一些特性,固然數據源是必須的配置,可是能夠選擇spring的數據源鏈接,不必定是德魯伊的數據源鏈接池。
對於配種中看到的<!-- ****** -->
註釋的部分更是本文講的重點,也就是要讓程序在控制檯打印mybatis的sql語句,這些配置很重要。
<property name="proxyFilters"> <list> <ref bean="statfilter" /> <ref bean="logFilter" /> </list> </property>
這裏是以代理模式過濾stat和log的,因此用的兩個bean分別是stat監控,log日誌記錄監控。
<property name="filters" value="stat,wall,log4j" />
這句的配置纔是在控制檯打印sql的重點,建議平時開發中,打開該配置,上線的時候關閉掉,緣由就是上面提到的,寫日誌很佔空間。
關於druid數據源配置屬性的列表,請查看後面:druid鏈接池配置屬性列表詳解
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:META-INF/spring/*.xml</param-value> </context-param> <!-- 初始化參數,引入log4j配置--> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>WEB-INF/classes/log4j.xml</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- 開啓德魯伊stat過濾,WebStatFilter用於採集web-jdbc關聯監控的數據,注意放在其它的過濾器以及dispatcher前面,很重哦 --> <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>/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> <!-- 下面的全部的init-param能夠不用配置,使用默認值便可,若是你有處女座情結,刪除便可 --> <!-- 缺省sessionStatMaxCount是1000個。你能夠按須要進行配置 --> <init-param> <param-name>sessionStatMaxCount</param-name> <param-value>1000</param-value> </init-param> <!-- druid 0.2.7版本開始支持profile,配置profileEnable可以監控單個url調用的sql列表 --> <init-param> <param-name>profileEnable</param-name> <param-value>true</param-value> </init-param> <!-- <init-param> <param-name>principalSessionName</param-name> <param-value>users.username</param-value> </init-param> --> <!-- 你能夠關閉session統計功能 --> <!-- <init-param> <param-name>sessionStatEnable</param-name> <param-value>true</param-value> </init-param> --> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--this listener must be defined before the spring listener--> <listener> <listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- log4j監聽器 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <!-- 德魯伊監控平臺監控器 --> <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>druid</param-value> </init-param> <init-param> <!-- 密碼 --> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> </web-app>
上面加了註解的配置,是本文配置的重點,其它配置不在這裏講解。
<!-- 開啓德魯伊stat過濾,WebStatFilter用於採集web-jdbc關聯監控的數據-->
<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>/static/*,*.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>
druid對除了靜態資源外底全部路由進行監控,該監控採集web-jdbc關聯監控的數據。而前面對數據源監控的配置,大部分是sql監控。
<init-param>
<!-- 容許清空統計數據 --> <param-name>resetEnable</param-name> <param-value>true</param-value> </init-param> <init-param> <!-- 用戶名 --> <param-name>loginUsername</param-name> <param-value>druid</param-value> </init-param> <init-param> <!-- 密碼 --> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param>
若是你不但願別人直接查看你的監控,請把查看權限配置加上。若是監控平臺被一些不安分的傢伙知道,網站面臨攻擊的可能性就很大,安全性不靠保障,因此建議配置帳戶信息。
過濾器中的配置,是用來定義咱們的監控選項,在以上的監控配置中,上面這段xml代碼配置了一個最簡單的監控,並採用了大量的默認配置,若是你想使用更豐富的監控配置,能夠在druid的github wiki上獲取更多的選項,地址:druid Filter 配置
<!-- 德魯伊監控平臺監控器 -->
<servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>
這個是德魯伊監控平臺提供的servlet web服務,啓動服務器後,只須要在瀏覽器中輸入:http://127.0.0.1:8080/druid/
便可訪問引言裏面的幾個圖。
注意,路由根據本身的狀況寫,若是你直接在idea中配置的,且idea中沒有配置context path的話,能夠不用項目名。若是配置了,就用配置的名字,好比配置爲test,則應該訪問http://127.0.0.1:8080/test/druid/
。
在eclipse中,須要跟項目名的。假如項目時test0,則應該是http://127.0.0.1:8080/test0/druid/
。固然了,若是不是這樣的話,聰明的你確定會嘗試幾回其它形式的路由訪問了。
固然還的注意端口號,我這裏面默認用了8080,若是你是8090,就換吧。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <!-- 注意這裏的大小寫,配置文件對大小寫敏感,主要是後面對該name的引用 --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n"/> </layout> </appender> <appender name="rollingFile" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="logs/server.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n"/> </layout> </appender> <!-- 配置mybatis打印sql語句 --> <!-- 這是網上看別人說的,我嘗試了,加與不加都不要緊,有興趣本身去嘗試 <category name="org.springframework" additivity="false"> <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/> </category> <category name="org.springframework.orm.ibatis3" additivity="false"> <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/> </category> <category name="org.apache.ibatis" additivity="false"> <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/> </category> <category name="java.sql" additivity="false"> <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/> </category>--> <!-- ++++++++++++++++++++++++ --> <!-- druid數據源配置打印日誌 start--> <logger name="druid.sql"> <level value="DEBUG"/> </logger> <logger name="druid.sql.DataSource"> <level value="DEBUG"/> </logger> <logger name="druid.sql.Connection"> <level value="DEBUG"/> </logger> <logger name="druid.sql.Statement"> <level value="DEBUG"/> </logger> <logger name="druid.sql.ResultSet"> <level value="DEBUG"/> </logger> <!-- druid數據源配置打印日誌 end --> <!-- ++++++++++++++++++++++++ --> <!-- spring提供的數據源打印日誌 --> <!-- <logger name="com.springframework" additivity="true"> <level value="DEBUG"/> </logger> <logger name="com.ibatis" additivity="true"> <level value="DEBUG"/> </logger> <logger name="com.ibatis.common.jdbc.SimpleDataSource" additivity="true"> <level value="DEBUG"/> </logger> <logger name="com.ibatis.common.jdbc.ScriptRunner" additivity="true"> <level value="DEBUG"/> </logger> <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" additivity="true"> <level value="DEBUG"/> </logger> <logger name="Java.sql.Connection" additivity="true"> <level value="DEBUG"/> </logger> <logger name="java.sql.Statement" additivity="true"> <level value="DEBUG"/> </logger> <logger name="java.sql.PreparedStatement" additivity="true"> <level value="DEBUG"/> </logger> <logger name="java.sql.ResultSet" additivity="true"> <level value="DEBUG"/> </logger> --> <root> <level value="INFO"/> <!-- 注意ref中的大小寫,就是前面配置的appender的name --> <appender-ref ref="CONSOLE"/> <!--<appender-ref ref="rollingFile" />--> </root> </log4j:configuration>
上面的配置看上去很雜,可是有用的配置用了<!-- ++++++++++++++++++++++++-->
包裹起來了,其它的配置都是看網上的配置,有些對配置根本沒有,有些事spring數據源監控sql的配置,對於德魯伊,就包裹部分的足夠了,說這句話,並非讓你放棄一些基本配置,基本配置永遠不能缺乏。
配置 | 缺省值 | 說明 |
---|---|---|
name | 配置這個屬性的意義在於,若是存在多個數據源,監控的時候能夠經過名字來區分開來。若是沒有配置,將會生成一個名字,格式是:」DataSource-」 + System.identityHashCode(this) | |
jdbcUrl | 鏈接數據庫的url,不一樣數據庫不同。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2;oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 鏈接數據庫的用戶名 | |
password | 鏈接數據庫的密碼。若是你不但願密碼直接寫在配置文件中,可使用ConfigFilter。詳細看這裏:https://github.com/alibaba/dr... | |
driverClassName | 根據url自動識別 | 這一項可配可不配,若是不配置druid會根據url自動識別dbType,而後選擇相應的driverClassName |
initialSize | 0 | 初始化時創建物理鏈接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時 |
maxActive | 8 | 最大鏈接池數量 |
maxIdle | 8 | 已經再也不使用,配置了也沒效果 |
minIdle | 最小鏈接池數量 | |
maxWait | 獲取鏈接時最大等待時間,單位毫秒。配置了maxWait以後,缺省啓用公平鎖,併發效率會有所降低,若是須要能夠經過配置useUnfairLock屬性爲true使用非公平鎖。 | |
poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。PSCache對支持遊標的數據庫性能提高巨大,好比說oracle。在mysql5.5如下的版本中沒有PSCache功能,建議關閉掉。5.5及以上版本有PSCache,建議開啓。 |
maxOpenPreparedStatements | -1 | 要啓用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改成true。在Druid中,不會存在Oracle下PSCache佔用內存過多的問題,能夠把這個數值配置大一些,好比說100 |
validationQuery | 用來檢測鏈接是否有效的sql,要求是一個查詢語句。若是validationQuery爲null,testOnBorrow、testOnReturn、testWhileIdle都不會其做用。 | |
testOnBorrow | true | 申請鏈接時執行validationQuery檢測鏈接是否有效,作了這個配置會下降性能。 |
testOnReturn | false | 歸還鏈接時執行validationQuery檢測鏈接是否有效,作了這個配置會下降性能 |
testWhileIdle | false | 建議配置爲true,不影響性能,而且保證安全性。申請鏈接的時候檢測,若是空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測鏈接是否有效。timeBetweenEvictionRunsMillis有兩個含義:1) Destroy線程會檢測鏈接的間隔時間 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 |
numTestsPerEvictionRun | 再也不使用,一個DruidDataSource只支持一個EvictionRun | |
minEvictableIdleTimeMillis | ||
connectionInitSqls | 物理鏈接初始化的時候執行的sql | |
exceptionSorter | 根據dbType自動識別 | 當數據庫拋出一些不可恢復的異常時,拋棄鏈接 |
filters | 屬性類型是字符串,經過別名的方式配置擴展插件,經常使用的插件有:監控統計用的filter:stat; 日誌用的filter:log4j;防護sql注入的filter:wall;合併sql的filter:mergeStat | |
proxyFilters | 類型是List<com.alibaba.druid.filter.Filter>,若是同時配置了filters和proxyFilters,是組合關係,並不是替換關係 |
前面說過,mybatis配置的時候,能夠配置sqlSessionFactory的時候經過configLocation屬性能夠指定mybatis的一些額外配置。
這裏分享一段數據庫字段值爲null時,不返回字段名,而咱們但願的是無論值爲何,字段名都應該返回。配置以下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="callSettersOnNulls" value="true"/> <setting name="logImpl" value="LOG4J" /> </settings> </configuration>