麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > 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基本配置成功。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费h片网站 | 免费看真人a一级毛片 | 国产精品99一区二区 | 日韩av手机在线免费观看 | 亚洲国产精品久久久久婷婷老年 | 99热1| 精品偷拍久久 | 99最新地址 | 一级毛片免费一级 | 久久久久久免费 | 深夜免费视频 | 一本色道久久综合狠狠躁篇适合什么人看 | 欧日韩在线视频 | 一级黄色免费观看 | 欧美aⅴ视频 | 91精品国产一区二区在线观看 | 亚洲电影免费观看国语版 | 天天看成人免费毛片视频 | 99国产精品白浆在线观看免费 | 欧美三日本三级少妇三级99观看视频 | 久久久久久久一区 | 男人的天堂色偷偷 | 黄色男女视频 | 毛片在线视频在线播放 | 欧美成人黄色小视频 | 国产91丝袜在线播放0 | 福利在线播放 | 成人羞羞视频在线观看免费 | 毛片一级片 | 国产91精品久久久 | 黄色aaa视频 | 久久精品一级片 | 国产精品伦视频看免费三 | aa国产视频一区二区 | 精品亚洲在线 | 亚洲午夜一区二区三区 | 免费国产自久久久久三四区久久 | 日本网站一区 | 午夜视频亚洲 | 黄色高清视频网站 | 精品亚洲免费 |