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

来源:互联网 发布:搜索引擎优化案例分析 编辑:程序博客网 时间:2024/05/21 17:13

一、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\u52A8druid.driver=com.mysql.jdbc.Driverdruid.jdbc_url=jdbc:mysql://localhost:3306/TZ_DMS_DEV?characterEncoding=utf8#?useUnicode=true&characterEncoding=UTF-8druid.username=rootdruid.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=60000sessionInfoName=sessionInfouploadFieldName=filedatauploadFileMaxSize=20971520uploadFileExts=txt,rar,zip,doc,docx,xls,xlsx,jpg,jpeg,gif,png,swf,wmv,avi,wma,mp3,miduploadDirectory=attacheddruid.filters=stat,log4jdruid.timeBetweenEvictionRunsMillis=60000druid.minEvictableIdleTimeMillis=300000druid.validationQuery=SELECT 'x'druid.testWhileIdle=truedruid.testOnBorrow=falsedruid.testOnReturn=falsedruid.maxOpenPreparedStatements=20druid.removeAbandoned=truedruid.removeAbandonedTimeout=1800druid.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,infolog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout.ConversionPattern=[%c] %5p - %m%n#errorlog4j.appender.error=org.apache.log4j.RollingFileAppenderlog4j.appender.error.File= logs/tz-dms-error.loglog4j.appender.error.MaxBackupIndex=10log4j.appender.error.MaxFileSize=512KBlog4j.appender.error.Threshold=ERRORlog4j.appender.error.layout=org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=%d - [%l] %5p [%c] - %m%n#infolog4j.appender.info=org.apache.log4j.RollingFileAppenderlog4j.appender.info.File= logs/tz-dms-info.loglog4j.appender.info.MaxBackupIndex=10log4j.appender.info.MaxFileSize=1024KBlog4j.appender.info.Threshold=INFOlog4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=%d %5p [%c] - %m%nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout#warnlog4j.appender.warn=org.apache.log4j.RollingFileAppenderlog4j.appender.warn.File= logs/tz-dms-warn.loglog4j.appender.warn.MaxBackupIndex=10log4j.appender.warn.MaxFileSize=1024KBlog4j.appender.warn.Threshold=WARNlog4j.appender.warn.layout=org.apache.log4j.PatternLayoutlog4j.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#druidlog4j.appender.druid= org.apache.log4j.DailyRollingFileAppender log4j.appender.druid.file= logs/tz-dms-druid.loglog4j.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= truelog4j.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 ) {      //处理逻辑    }
阅读全文
0 0