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

本文介绍了Druid作为高效数据库连接池的优势,并详细阐述了如何在SSM(Spring、SpringMVC、Mybatis)框架中配置Druid,包括事务管理和Session监听。还提及了Druid的监控性能、SQL执行日志和扩展JDBC功能。在实际操作中,通过Spring配置文件、mybatis-config.xml等实现Druid与Mybatis的整合,并在Service层使用@Transactional注解进行事务控制。

摘要生成于 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>  

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>  

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

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>

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>

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

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>

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 已失效");
    }  
  
 }  

9.mybatis事务的使用

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

@Override
	@Transactional
	public void generateStorageRecords(BaseProductInfo baseProductInfo ) {
	  //处理逻辑
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值