ssm框架使用druid数据库连接池(带事务配置和session监听)

本文介绍Druid作为高性能数据库连接池的配置方法及其监控功能,包括整合MyBatis实现数据库事务管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、druid简介 
Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

同时Druid不仅仅是一个数据库连接池,它包括四个部分:

Druid是一个JDBC组件,它包括三个部分:

基于Filter-Chain模式的插件体系。

DruidDataSource 高效可管理的数据库连接池。

SQLParser

Druid的功能

1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

二、配置druid和mybatis数据库事务

  1. Spring配置文件applicationContext.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-4.1.xsd  
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">

    <import resource="spring-mybatis.xml"/>

    <!-- druid spring monitor setting -->
    <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />
    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
    <property name="patterns">
    <list>
    <value>com.dacheng.service.*</value>
    <value>com.dacheng.dao.*</value>
    </list>
    </property>
    </bean>
    <aop:config proxy-target-class="true">
    <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />
    </aop:config>

</beans>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.spring-mvc配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                        http://www.springframework.org/schema/mvc    
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">  

    <!-- 开启了自动扫描,发现service层并不能回滚。
        启动组件扫描,排除@Service组件,注:如果此处必须排除掉@Service组件 
    原因:springmvc的配置文件与spring的配置文件不是同时加载,如果这边不进行这样的设置,
    那么,spring就会将所有带@Service注解的类都扫描到容器中,
    等到加载spring的配置文件的时候,会因为容器已经存在Service类,
    使得cglib将不对Service进行代理,直接导致的结果就是在spring配置文件中的事务配置不起作用,发生异常时,无法对数据进行回滚 
    -->
    <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->  
    <context:component-scan base-package="com.dacheng.controller" /> 

    <!-- 启动Spring定时任务 --> 
    <task:annotation-driven/>

    <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> 
    <mvc:annotation-driven/>    

    <!-- 定义跳转的文件的前后缀 ,视图模式配置-->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->  
        <property name="prefix" value="WEB-INF/jsp/" />  
        <property name="suffix" value=".jsp" />  
    </bean>       

    <!-- 处理静态资源 -->
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
        <property name="favorPathExtension" value="false" />
        <property name="favorParameter" value="false" /> 
        <property name="ignoreAcceptHeader" value="false" /> 
        <property name="mediaTypes" > 
        <value>
            atom=application/atom+xml
            html=text/html
            json=application/json
            *=*/*
        </value> 
        </property>
    </bean>

    <!--
    <bean class="com.dacheng.controller.InitData"></bean>  
    -->

</beans>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

3.jdbc.properties配置文件

#\u9A71\u52A8
druid.driver=com.mysql.jdbc.Driver

druid.jdbc_url=jdbc:mysql://localhost:3306/TZ_DMS_DEV?characterEncoding=utf8

#?useUnicode=true&characterEncoding=UTF-8

druid.username=root
druid.password=123456

#\u5B9A\u4E49\u521D\u59CB\u8FDE\u63A5\u6570  
druid.initialSize=0
#\u5B9A\u4E49\u6700\u5927\u8FDE\u63A5\u6570  
druid.maxActive=20
#\u5B9A\u4E49\u6700\u5927\u7A7A\u95F2  
druid.maxIdle=20
#\u5B9A\u4E49\u6700\u5C0F\u7A7A\u95F2  
druid.minIdle=1
#\u5B9A\u4E49\u6700\u957F\u7B49\u5F85\u65F6\u95F4  
druid.maxWait=60000
sessionInfoName=sessionInfo

uploadFieldName=filedata
uploadFileMaxSize=20971520
uploadFileExts=txt,rar,zip,doc,docx,xls,xlsx,jpg,jpeg,gif,png,swf,wmv,avi,wma,mp3,mid
uploadDirectory=attached

druid.filters=stat,log4j
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.maxOpenPreparedStatements=20
druid.removeAbandoned=true
druid.removeAbandonedTimeout=1800
druid.logAbandoned=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

4.mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>  
        <setting name="logImpl" value="LOG4J"/>  
    </settings>  
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.spring-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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-4.1.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
                        http://www.springframework.org/schema/task 
                        http://www.springframework.org/schema/task/spring-task-4.1.xsd">

    <!-- 自动扫描注入,这个是放dao,demin,mapping的包的名字 ,且不扫描controller-->  
    <context:component-scan base-package="com.dacheng" > 
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
    </context:component-scan> 

    <!-- 引入配置文件 -->  
    <!-- <bean id="propertyConfigurer"  
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="location" value="classpath:jdbc.properties" />  
    </bean> -->

    <!-- 加载数据库参数 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>  

    <!-- 配置DataSource数据源 -->  
    <!-- 阿里 druid 数据库连接池 -->
    <bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" destroy-method = "close">  
         <!-- 数据库基本信息配置 -->
         <property name = "url" value = "${druid.jdbc_url}" />  
         <property name = "username" value = "${druid.username}" />  
         <property name = "password" value = "${druid.password}" />  
         <property name = "driverClassName" value = "${druid.driver}" />  

         <!-- 最大并发连接数 -->
         <property name = "maxActive" value = "${druid.maxActive}" />

         <!-- 初始化连接数量 -->
         <property name = "initialSize" value = "${druid.initialSize}" />

         <!-- 配置获取连接等待超时的时间 -->
         <property name = "maxWait" value = "${druid.maxWait}" />

         <!-- 最小空闲连接数 -->
         <property name = "minIdle" value = "${druid.minIdle}" />  

         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
         <property name = "timeBetweenEvictionRunsMillis" value ="${druid.timeBetweenEvictionRunsMillis}" />

         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
         <property name = "minEvictableIdleTimeMillis" value ="${druid.minEvictableIdleTimeMillis}" />  
         <property name = "validationQuery" value = "${druid.validationQuery}" />  
         <property name = "testWhileIdle" value = "${druid.testWhileIdle}" />  
         <property name = "testOnBorrow" value = "${druid.testOnBorrow}" />  
         <property name = "testOnReturn" value = "${druid.testOnReturn}" />  
         <property name = "maxOpenPreparedStatements" value ="${druid.maxOpenPreparedStatements}" />

         <!-- 打开 removeAbandoned 功能 -->
         <property name = "removeAbandoned" value = "${druid.removeAbandoned}" />

         <!-- 1800 秒,也就是 30 分钟 -->
         <property name = "removeAbandonedTimeout" value ="${druid.removeAbandonedTimeout}" />

         <!-- 关闭 abanded 连接时输出错误日志 -->   
         <property name = "logAbandoned" value = "${druid.logAbandoned}" />

         <!-- ******重要的配置:监控统计拦截的filters,日志记录 *start* ******-->
         <!-- 并在filters属性中配置了log4j,ref中的bean是下面拦截器的配置 -->
         <!-- proxyFilters和filters是组合关系,前者是根据bean配置,后者根据别名配置的-->
         <!-- stat是statfilter的别名,log4j是logFilter的别名-->
         <!-- 监控统计拦截的filters,日志记录,这里开启了stat,wall(sql翻过墙过滤监控),log4j(log4j的监控)配置 -->
         <!-- 这里是以代理模式过滤stat和log的,所以用的两个bean分别是stat监控,log日志记录监控。 -->
         <property name="proxyFilters">
            <list>
                <ref bean="statfilter" />
                <ref bean="logFilter" />
            </list>
         </property>

         <!-- 这句的配置才是在控制台打印sql的重点,建议平时开发中,打开该配置,上线的时候关闭掉,原因就是上面提到的,写日志很占空间。 -->
         <!-- <property name = "filters" value = "${druid.filters}" />   -->
         <!-- 放置SQL依赖注入 -->
         <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* -->


    <!-- 配置SqlSessionFactoryBean --> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource"/>  
        <property name="configLocation" value="classpath:mybatis-config.xml"/> 
        <!-- mapper和resultmap配置路径   -->
        <property name="mapperLocations" value="classpath:com/dacheng/mapper/*.xml"></property> 
    </bean>

    <!-- 通过扫描的模式,扫描在com.cyh.sy.dao.mapper目录下的所有mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.dacheng.dao"/>  
    </bean>

    <!-- 创建一个sqlSession实例,线程安全的,可以在所有DAO实例共享,原理是将sqlSession,事务与当前线程挂钩 -->
    <bean name="sqlSessionTemplateASS" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

    <!-- 事务相关控制 -->
       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务增强,这里用的是spring提供的特性-->
    <tx:advice id="tx" 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>

    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.dacheng.service..*iml.*(..))" />
        <!--把事务控制在Service层-->
        <aop:advisor pointcut-ref="pc" advice-ref="tx" />
    </aop:config>

    <!-- 启用注解扫描 -->
    <context:component-scan base-package="com.dacheng.*">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161

6.log4j.properties配置文件

#log4j.logger.org.springframework=OFF  
#log4j.logger.com.opensymphony.xwork2=OFF  
#log4j.logger.com.mybatis=OFF  

log4j.rootLogger=INFO,stdout,warn,error,info,druid
#log4j.rootLogger=INFO,stdout,warn,error,info
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout.ConversionPattern=[%c] %5p - %m%n

#error
log4j.appender.error=org.apache.log4j.RollingFileAppender
log4j.appender.error.File= logs/tz-dms-error.log
log4j.appender.error.MaxBackupIndex=10
log4j.appender.error.MaxFileSize=512KB
log4j.appender.error.Threshold=ERROR
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d - [%l] %5p [%c] - %m%n

#info
log4j.appender.info=org.apache.log4j.RollingFileAppender
log4j.appender.info.File= logs/tz-dms-info.log
log4j.appender.info.MaxBackupIndex=10
log4j.appender.info.MaxFileSize=1024KB
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d %5p [%c] - %m%n
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

#warn
log4j.appender.warn=org.apache.log4j.RollingFileAppender
log4j.appender.warn.File= logs/tz-dms-warn.log
log4j.appender.warn.MaxBackupIndex=10
log4j.appender.warn.MaxFileSize=1024KB
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d %5p [%c] - %m%n

###\u663E\u793ASQL\u8BED\u53E5\u90E8\u5206
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG

#druid
log4j.appender.druid= org.apache.log4j.DailyRollingFileAppender 
log4j.appender.druid.file= logs/tz-dms-druid.log
log4j.appender.druid.layout= org.apache.log4j.PatternLayout 
log4j.appender.druid.layout.ConversionPattern= [druid] %d [%-15.15t] %-5p %-30.30c {1} - %m%n   
log4j.appender.druid.DatePattern= yyyy-MM-dd'.log'
log4j.appender.druid.MaxFileSize=40MB  
log4j.appender.druid.MaxBackupIndex=40  
log4j.appender.druid.append= true 
log4j.appender.druid.ImmediateFlush= true

log4j.logger.druid.sql=info,druid  
log4j.logger.druid.sql.DataSource=info,druid  
log4j.logger.druid.sql.Connection=info,druid  
#debug可以看出所有的SQL
#log4j.logger.druid.sql.Statement=debug,druid  
log4j.logger.druid.sql.ResultSet=info,druid
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

7.web.xml配置文件

为防止出错,监控的顺序要特别注意,druid需要放在前面,随后是log4j的监控
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd " 
    id="WebApp_ID" version="3.0">
  <display-name>TZ-DMS</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>WechatMenuConfig.jsp</welcome-file>
  </welcome-file-list>

    <!-- 启用Web监控统计功能 -->
    <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>
         <!-- 下面的所有的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> -->

   <!-- 定义LOG4J监听器 ,打印log放在前面防止出错-->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <!-- log4jConfigLocation:log4j配置文件存放路径 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.properties</param-value>
    </context-param>

     <!-- 加载Spring容器配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 设置Spring容器加载所有的配置文件的路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 配置SpringMVC核心控制器 -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 启动加载一次 -->  
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--为DispatcherServlet建立映射 -->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!-- 此处可以可以配置成*.do 适配Struts的习惯-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 防止Spring内存溢出监听器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>

    <!-- 解决工程编码过滤器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>       

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <listener>  <!-- 监听session  -->
        <listener-class>com.dacheng.util.MySessionListener</listener-class>    
    </listener>  

    <!-- 德鲁伊监控平台监控器 --> 
    <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>123456</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>

</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160

8.session的监听

package com.dacheng.util;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.log4j.Logger;

public class MySessionListener implements HttpSessionListener{  

    Logger log = Logger.getLogger(getClass());

    @Override  
    public void sessionCreated(HttpSessionEvent se){
        log.info("session 已创建");
    }  

    @Override      
    public void sessionDestroyed(HttpSessionEvent se){  
       log.info("session 已失效");
    }  

 }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

9.mybatis事务的使用

在service业务层的方法前加上 @Transactional

@Override
    @Transactional
    public void generateStorageRecords(BaseProductInfo baseProductInfo ) {
      //处理逻辑

    }
### SSM框架中的配置文件及其关系 #### 1. **web.xml** `web.xml` 是 Java Web 应用程序的部署描述符,用于定义应用程序的整体结构初始化参数。它是整个项目的入口点。 - 定义 `DispatcherServlet` 的映射路径,负责拦截所有 HTTP 请求并将它们转发到 Spring MVC 控制器。 - 配置监听器(Listener),例如 `ContextLoaderListener`,用于加载全局上下文 `applicationContext.xml` 或其他类似的 XML 文件。 - 设置过滤器(Filter),如字符编码过滤器,确保请求响应的编码一致性。 ```xml <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 此部分通过 `ContextLoaderListener` 初始化全局上下文,并由 `DispatcherServlet` 加载特定于 Spring MVC 的配置[^1]。 --- #### 2. **spring-mybatis.xml** 该文件主要用于 MyBatis Spring 的集成,配置数据源、事务管理器以及 SQL Session 工厂。 - 数据源 (`DataSource`) 使用第三方库(如 Druid、C3P0)实现数据库连接池。 - 配置事务管理器 (`TransactionManager`) 来管理事务。 - 创建 `SqlSessionFactory` 并将其与 MyBatis 映射文件关联。 ```xml <!-- 数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:mapper/*.xml" /> </bean> <!-- Mapper 扫描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> ``` 此部分实现了 MyBatis Spring 的无缝集成,使得 DAO 层可以通过注解或接口方式访问数据库[^2]。 --- #### 3. **spring-mvc.xml** 这是 Spring MVC 的核心配置文件,主要关注前端控制器的行为视图解析。 - 组件扫描仅限于 Controller 类型的 Bean。 - 配置视图解析器以指定 JSP 页面的位置扩展名。 - 启用对静态资源的支持以及其他高级功能。 ```xml <context:component-scan base-package="com.ssm.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <mvc:default-servlet-handler/> <mvc:annotation-driven/> ``` 这部分专注于处理用户的请求并返回相应的视图[^1]。 --- #### 4. **mybatis-config.xml** MyBatis 的核心配置文件,通常包含通用设置插件声明。 - 配置缓存机制。 - 指定日志记录工具。 - 添加自定义类型处理器或其他扩展组件。 ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 缓存设置 --> <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> </settings> <!-- 日志记录 --> <typeAliases> <package name="com.example.model"/> </typeAliases> <!-- 插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins> </configuration> ``` 此文件提供了 MyBatis 运行所需的底层支持,而具体的 SQL 映射则交由单独的 Mapper 文件完成[^3]。 --- #### 配置关系总结 1. **web.xml** 负责启动容器并加载全局上下文 DispatcherServlet。 2. **spring-mybatis.xml** 提供了持久层所需的数据源、事务管理会话工厂。 3. **spring-mvc.xml** 处理业务逻辑视图渲染。 4. **mybatis-config.xml** 则作为 MyBatis 的基础配置文件,补充了额外的功能选项。 这些文件相互协作,共同构建了一个完整的 SSM 架构应用。 --- #### 常见问题及解决方法 1. 如果服务无法找到对应的 Bean,则需确认是否正确注册了相关组件扫描范围或手动定义了 Bean 实例[^4]。 2. 当遇到数据库操作异常时,请检查 `sqlSessionFactory` 是否成功加载了正确的 Mapper 文件位置。 3. 若页面显示错误提示未找到视图名称,请验证视图解析器前缀后缀是否匹配实际目录结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值