您的位置:首页 > 产品设计 > UI/UE

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

2017-12-05 09:12 423 查看
一、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数据库事务
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"
xm
4000
lns: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="
20000
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 ) {
//处理逻辑

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: