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数据库事务
- 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 ) { //处理逻辑 }
- ssm框架使用druid数据库连接池(带事务配置和session监听)
- ssm框架使用druid数据库连接池(带事务配置和session监听)
- 基于SSM的数据库连接池框架druid的使用
- 基于SSM的数据库连接池框架druid的使用
- springmvc(五)集成阿里 druid数据库连接池和事务等配置,集成mybatis
- 引入阿里Druid数据库连接池(maven ssm框架)
- Druid数据库连接池及内置监控的配置和使用
- Druid数据库连接池及内置监控的配置和使用
- 使用SSM框架配置多个数据库连接
- SpringBoot中配置使用Druid数据库连接池
- druid数据库连接池配置
- 数据库连接池druid配置
- 阿里Druid数据连接池在SSM框架中的配置使用
- Druid数据库连接池的使用和详解
- DBCP和Druid数据库连接池使用
- Druid数据库连接池使用
- Druid数据库连接池使用
- Druid数据库连接池使用
- Encog3Java-User.pdf翻译:第九章 使用图像数据
- 使用.net core ABP和Angular模板构建博客管理系统(实现博客列表页面)
- FPGA_CLOCK
- 关于浏览器内核及其 CSS 写法
- 设置右键菜单可以选择使用qtcreator打开
- ssm框架使用druid数据库连接池(带事务配置和session监听)
- HTML-doctype,meta
- 使用.net core ABP和Angular模板构建博客管理系统(完善前台服务)
- Android生成签名文件并用其对apk文件进行签名(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误完美解决)
- 12月10日周日下午广州Linuxer聚会(4大演讲主题+蜗窝大侠郭健主持)
- [ARC085]F
- 笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to...
- AOE网上的关键路径
- 数据结构之并查集