mybatis使用spring-druid數據源鏈接池配置log4j打印sql語句以及開啓監控平臺

雜七雜的雜

做爲程序員,開發工程中,一套利於測試或者監控的工具很重要,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加載properties鍵值對

其實與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 # 數據庫登陸密碼

mybatis.xml配置

<?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鏈接池配置屬性列表詳解

web.xml配置

<?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,就換吧。

重軸戲:log4j.xml配置

<?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的配置,對於德魯伊,就包裹部分的足夠了,說這句話,並非讓你放棄一些基本配置,基本配置永遠不能缺乏。

druid鏈接池配置屬性列表詳解

配置 缺省值 說明
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>
相關文章
相關標籤/搜索