亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

SpringMVC + MyBatis + Mysql + Redis(作為二級緩存) 配置

2024-04-27 15:12:52
字體:
來源:轉載
供稿:網友

項目環境: 在SPRingMVC + MyBatis + MySQL。Redis部署在linux虛擬機。 1、整體思路

參考Ehcache實現MyBatis二級緩存代碼(Maven引用對應jar查閱)使用Spring管理Redis連接池模仿EhcacheCache,實現RedisCache

2、pom.xml中加入Maven依賴`

<!-- spring-redis實現 --><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.2.RELEASE</version></dependency><!-- redis客戶端jar --><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version></dependency><!-- Ehcache實現,用于參考 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version></dependency>`

3、引入applicationContext.xml中引入redis配置

<!-- 引入數據庫配置文件 --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:redis.properties</value> </list> </property></bean><!-- redis數據源 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxTotal" value="${redis.maxActive}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean><!-- Spring-redis連接池管理工廠 --><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:passWord="${redis.pass}" p:pool-config-ref="poolConfig"/> <!-- 使用中間類解決RedisCache.jedisConnectionFactory的靜態注入,從而使MyBatis實現第三方緩存 --><bean id="redisCacheTransfer" class="com.strive.cms.cache.RedisCacheTransfer"> <property name="jedisConnectionFactory" ref="jedisConnectionFactory"/></bean>

4、創建緩存實現類RedisCache

/** * * @描述: 使用第三方內存數據庫Redis作為二級緩存 * @版權: Copyright (c) 2016 * @作者: xiad * @版本: 1.0 * @創建日期: 2016年3月2日 * @創建時間: 下午8:02:57 */public class RedisCache implements Cache{ private static final Logger logger = LoggerFactory.getLogger(RedisCache.class); private static JedisConnectionFactory jedisConnectionFactory; private final String id; /** * The {@code ReadWriteLock}. */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } logger.debug("MybatisRedisCache:id=" + id); this.id = id; } @Override public void clear() { JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); connection.flushDb(); connection.flushAll(); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } } @Override public String getId() { return this.id; } @Override public Object getObject(Object key) { Object result = null; JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result = serializer.deserialize(connection.get(serializer.serialize(key))); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } @Override public int getSize() { int result = 0; JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); result = Integer.valueOf(connection.dbSize().toString()); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } @Override public void putObject(Object key, Object value) { JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); connection.set(serializer.serialize(key), serializer.serialize(value)); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } } @Override public Object removeObject(Object key) { JedisConnection connection = null; Object result = null; try { connection = jedisConnectionFactory.getConnection(); RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(); result =connection.expire(serializer.serialize(key), 0); } catch (JedisConnectionException e) { e.printStackTrace(); } finally { if (connection != null) { connection.close(); } } return result; } public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) { RedisCache.jedisConnectionFactory = jedisConnectionFactory; }}

5、創建中間類RedisCacheTransfer,完成RedisCache.jedisConnectionFactory的靜態注入

/** * * @描述: 靜態注入中間類 * @版權: Copyright (c) 2016 * @作者: xiad * @版本: 1.0 * @創建日期: 2016年3月2日 * @創建時間: 下午8:02:57 */public class RedisCacheTransfer { @Autowired public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) { RedisCache.setJedisConnectionFactory(jedisConnectionFactory); }}

6、配置文件redis.properties

# Redis settings redis.host=192.168.25.132redis.port=6379 redis.pass=redis.maxIdle=300 redis.maxActive=600 redis.maxWait=1000 redis.testOnBorrow=true

7、mapper中加入MyBatis二級緩存

<mapper namespace="com.strive.cms.dao.site.CatalogMapper" > <cache type="com.strive.cms.cache.RedisCache"/> .....</mapper>

8、Mybatis全局配置

<?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> <!-- 配置mybatis的緩存,延遲加載等等一系列屬性 --> <settings> <!-- 全局映射器啟用緩存 --> <setting name="cacheEnabled" value="true"/> <!-- 查詢時,關閉關聯對象即時加載以提高性能 --> <setting name="lazyLoadingEnabled" value="false"/> <!-- 對于未知的SQL查詢,允許返回不同的結果集以達到通用的效果 --> <setting name="multjava property names aColumn. --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (session) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. --> <setting name="localCacheScope" value="SESSION"/> <!-- Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. --> <setting name="jdbcTypeForNull" value="OTHER"/> <!-- Specifies which Object's methods trigger a lazy load --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!-- 設置關聯對象加載的形態,此處為按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="true"/> </settings></configuration>

9、打印Sql日志,方便測試

#定義LOG輸出級別為INFOlog4j.rootLogger=INFO,Console,File####定義日志輸出目的地為控制臺log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.out#可以靈活地指定日志輸出格式,下面一行是指定具體的格式log4j.appender.Console.layout = org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%c] - %m%n####文件大小到達指定尺寸的時候產生一個新的文件log4j.appender.File = org.apache.log4j.RollingFileAppender#指定輸出目錄log4j.appender.File.File = logs/ssm.log#定義文件最大大小log4j.appender.File.MaxFileSize = 10MB#輸出所以日志,如果換成DEBUG表示輸出DEBUG以上級別日志log4j.appender.File.Threshold = ALLlog4j.appender.File.layout = org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH/:mm/:ss}][%c]%m%n####顯示本項目SQL語句部分log4j.logger.com.strive.cms=DEBUG

10、測試代碼

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class MyBatisCacheSecondTest{ private static final Logger logger = LoggerFactory.getLogger(MyBatisCacheSecondTest.class); @Autowired private SiteService service; /* * 二級緩存測試 */ @Test public void testCache2() { PageInfo<Site> page1 = service.querySite("", 1, 2, "", ""); logger.info(page1.getList().get(1).getName()); PageInfo<Site> page2 = service.querySite("", 2, 2, "", ""); logger.info(page2.getList().get(0).getName()); PageInfo<Site> page3 = service.querySite("", 1, 2, "", ""); logger.info(page3.getList().get(0).getName()); } }

首次運行結果 這里寫圖片描述 后續運行結果 這里寫圖片描述 同條件的查詢語句可以發現,已經不再查詢Mysql,而是直接取Redis數據 查看Redis數據庫 keys *, 會發現多了很多數據,結果如下 這里寫圖片描述 至此,Redis基本配置成功。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品福利在线| 在线性视频日韩欧美| xvideos成人免费中文版| 精品久久久久久久久久久久久久| 国产va免费精品高清在线观看| 国产999精品视频| 日韩在线视频中文字幕| 亚洲欧美另类国产| 青草成人免费视频| 日韩在线观看免费高清| 精品欧美aⅴ在线网站| 97成人精品视频在线观看| 欧美老少配视频| 欧美成人免费全部观看天天性色| 国产精品视频白浆免费视频| 国产精品99久久久久久www| 欧洲成人午夜免费大片| 日产精品99久久久久久| 国产精品福利无圣光在线一区| 黑人狂躁日本妞一区二区三区| 国产精品成人一区二区三区吃奶| 成人亚洲综合色就1024| 日韩欧美有码在线| 日韩欧美国产视频| 国产91色在线|免| 韩国三级日本三级少妇99| 久久99国产精品久久久久久久久| 亚洲女性裸体视频| 国产精品电影久久久久电影网| 国产97在线观看| 1769国产精品| 亚洲精品短视频| 国产成人在线视频| 欧美激情国产日韩精品一区18| 亚洲电影免费观看高清完整版在线| 日韩国产精品亚洲а∨天堂免| 国产精品白丝jk喷水视频一区| 中文字幕亚洲激情| 菠萝蜜影院一区二区免费| 国产精品成人一区| 国产精品观看在线亚洲人成网| 欧美精品videofree1080p| 国产精品丝袜久久久久久高清| 国产精品福利在线观看网址| 国产成人精品免高潮费视频| 91精品中文在线| 欧美性色19p| 欧美视频专区一二在线观看| 国产精品日韩在线播放| 精品国产电影一区| 欧美高跟鞋交xxxxhd| 色婷婷亚洲mv天堂mv在影片| 国产精品第七十二页| 97人人爽人人喊人人模波多| 中文字幕在线国产精品| 欧美精品18videos性欧| 91国内精品久久| 色偷偷av一区二区三区乱| 亚洲国产精久久久久久久| 日韩欧美在线免费观看| 热99久久精品| 亚洲天堂视频在线观看| 欧美精品成人在线| 欧美与黑人午夜性猛交久久久| 91精品视频免费看| 日本中文字幕成人| 日韩风俗一区 二区| 久久久精品999| 亚洲女人天堂成人av在线| 国产欧美日韩亚洲精品| 日韩中文字在线| 亚洲欧美日韩精品久久奇米色影视| 2019中文字幕全在线观看| 亚洲欧美另类人妖| 九九热这里只有精品免费看| 久久久久久国产免费| 国产欧美在线观看| 亚洲精品久久久久久久久久久久久| 国产精品18久久久久久首页狼| 久久久久久久久久久久久久久久久久av| 日韩国产在线看| 欧美激情精品久久久久| 97在线视频免费看| 日本高清+成人网在线观看| 午夜精品在线视频| 日韩小视频网址| 精品久久久久久中文字幕大豆网| 亚洲九九九在线观看| 国产精品h在线观看| 久久国产精品亚洲| 国产精品欧美久久久| 国产精品欧美风情| 国产免费亚洲高清| 国产欧美日韩亚洲精品| 欧美老肥婆性猛交视频| 亚洲一区二区三区视频播放| 欧美精品videos性欧美| 久99久在线视频| 国产欧美日韩丝袜精品一区| 国产日本欧美一区二区三区| 久久久久久亚洲精品中文字幕| 国产欧美一区二区白浆黑人| 国产性猛交xxxx免费看久久| 人人澡人人澡人人看欧美| 国产精品第七十二页| 亚洲香蕉成人av网站在线观看| 亚洲成人黄色在线| 国产精品高清在线观看| 国产成人一区二区| 欧美精品videosex性欧美| 中文字幕日韩精品有码视频| 国产精品成人av在线| 欧美国产第一页| 亚洲欧美中文另类| 日韩中文字幕精品视频| 久久久久久亚洲精品中文字幕| 久久久久女教师免费一区| 亚洲国产成人精品久久| 亚洲午夜未删减在线观看| 国产成+人+综合+亚洲欧洲| 91av在线网站| 精品国偷自产在线| 欧美国产日韩视频| 久久久精品免费| 色伦专区97中文字幕| 91精品一区二区| 国产精品96久久久久久又黄又硬| 久久国产一区二区三区| 精品国产成人av| 精品国产鲁一鲁一区二区张丽| 国产亚洲欧美视频| 日韩电影中文 亚洲精品乱码| 欧美性69xxxx肥| 欧美激情精品在线| 亚洲精品按摩视频| 91在线播放国产| 热久久99这里有精品| 国产日韩欧美在线视频观看| 欧美精品在线播放| 亚州av一区二区| 久久免费福利视频| 国模精品视频一区二区| 欧美野外猛男的大粗鳮| 成人久久精品视频| 亚洲已满18点击进入在线看片| 欧美性猛交xxxx久久久| 亚洲午夜精品久久久久久久久久久久| 久久久久国产精品免费| 国产在线播放不卡| 欧美特级www| 亚洲激情视频在线观看| 欧美裸体男粗大视频在线观看| 亚洲国产欧美一区二区丝袜黑人| 国产精品美女呻吟| 国产视频一区在线| 国产精品爱啪在线线免费观看| 国产在线视频不卡| 色偷偷9999www| 欧美精品videos性欧美| 亚洲女人被黑人巨大进入| 中文字幕在线亚洲| 色久欧美在线视频观看| 亚洲成人亚洲激情| www欧美xxxx|