久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      SSM項(xiàng)目加入Redis支持的方法介紹

      SSM項(xiàng)目加入Redis支持的方法介紹

      需要先搭好SSM開(kāi)發(fā)環(huán)境,并安裝好Redis,下面是具體的實(shí)現(xiàn)步驟:

      1、在項(xiàng)目中引入jedis架包:jedis-2.8.2.jar、spring-data-redis-1.6.2.RELEASE.jar和commons-pool-1.6.jar,注意引入的jar版本,過(guò)高或過(guò)低都有可能引發(fā)異常,上面提到這些版本組合親測(cè)可用;

      2、編寫Redis需要用的2個(gè)工具類 RedisUtil.java和SerializeUtil.java

      3、新增一個(gè)Cache類MybatisRedisCache,實(shí)現(xiàn) org.apache.ibatis.cache.Cache 接口

      4、開(kāi)啟mybatis對(duì)緩存的支持,在本項(xiàng)目中,是修改 mybatis-config.xml文件

      5、在相關(guān)的 mapper.xml 添加自定義的緩存類MybatisRedisCache

      RedisUtil工具類是用以跟Redis數(shù)據(jù)通信,SerializeUtil為序列化工具類,也是lang包下的工具,主要用于序列化操作,同時(shí)提供對(duì)象克隆接口。下面是具體代碼:

      import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;  public class RedisUtil {     private static String ADDR = "127.0.0.1";     private static int PORT = 6379;     private static int MAX_ACTIVE = 1024;      private static int MAX_IDLE = 200;      private static int MAX_WAIT = 100000;      private static int TIMEOUT = 10000;      private static boolean TEST_ON_BORROW = true;      private static JedisPool jedisPool = null;      static {         try{             JedisPoolConfig config = new JedisPoolConfig();             config.setMaxIdle(MAX_IDLE);             config.setMaxWaitMillis(MAX_WAIT);             config.setTestOnBorrow(TEST_ON_BORROW);             jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT);         }catch (Exception e) {             e.printStackTrace();         }     }      public synchronized static Jedis getJedis(){         try{             if(jedisPool != null){                 Jedis jedis = jedisPool.getResource();                 return jedis;             }else{                 return null;             }         }catch (Exception e) {             e.printStackTrace();             return null;         }     }      public static void returnResource(final Jedis jedis){         if(jedis != null){             jedisPool.returnResource(jedis);         }     } }
      import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;  public class SerializeUtil {     public static byte[] serialize(Object object) {         ObjectOutputStream oos = null;         ByteArrayOutputStream baos = null;         try {             // 序列化             baos = new ByteArrayOutputStream();             oos = new ObjectOutputStream(baos);             oos.writeObject(object);             byte[] bytes = baos.toByteArray();             return bytes;         } catch (Exception e) {             e.printStackTrace();         }         return null;     }      public static Object unserialize(byte[] bytes) {         if (bytes == null)             return null;         ByteArrayInputStream bais = null;         try {             // 反序列化             bais = new ByteArrayInputStream(bytes);             ObjectInputStream ois = new ObjectInputStream(bais);             return ois.readObject();         } catch (Exception e) {             e.printStackTrace();         }         return null;     }  }  import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;  import org.apache.ibatis.cache.Cache; import org.slf4j.Logger; import org.slf4j.LoggerFactory;  public class MybatisRedisCache implements Cache {      private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);       /** The ReadWriteLock. */       private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();      private String id;      public MybatisRedisCache(final String id) {            if (id == null) {              throw new IllegalArgumentException("Cache instances require an ID");          }          logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id="+id);          this.id = id;      }       public String getId() {          return this.id;      }     public void putObject(Object key, Object value) {          logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value);          RedisUtil.getJedis().set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));      }     public Object getObject(Object key) {          Object value = SerializeUtil.unserialize(RedisUtil.getJedis().get(SerializeUtil.serialize(key.toString())));          logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value);          return value;     }     public Object removeObject(Object key) {          return RedisUtil.getJedis().expire(SerializeUtil.serialize(key.toString()),0);      }   public void clear() {          RedisUtil.getJedis().flushDB();      }     public int getSize() {          return Integer.valueOf(RedisUtil.getJedis().dbSize().toString());      }     public ReadWriteLock getReadWriteLock() {          return readWriteLock;      } }

      mybatis-config.xml文件,在spring-mybatis.xml文件中選擇全局加載:

      <!-- 配置mybatis -->     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">         <property name="dataSource" ref="dataSource" />         <!-- 加載mybatis的全局配置文件 -->         <property name="configLocation" value="classpath:resource/mybatis-config.xml"></property>         <!-- mapper掃描 -->         <property name="mapperLocations" value="classpath:resource/mapper/*.xml"></property>        </bean>

      以下是mybatis-config.xml詳細(xì)代碼:

      <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"       "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>      <settings>          <!-- 全局映射器啟用緩存 -->         <setting name="cacheEnabled" value="true"/>          <!-- 查詢時(shí),關(guān)閉關(guān)聯(lián)對(duì)象即時(shí)加載以提高性能 -->         <setting name="lazyLoadingEnabled" value="false"/>          <!-- 對(duì)于未知的SQL查詢,允許返回不同的結(jié)果集以達(dá)到通用的效果 -->         <setting name="multipleResultSetsEnabled" value="true"/>          <!-- 允許使用列標(biāo)簽代替列名 -->         <setting name="useColumnLabel" value="true"/>          <!-- 不允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋 -->         <setting name="useGeneratedKeys" value="false"/>          <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 FULL,PARTIAL -->         <setting name="autoMappingBehavior" value="PARTIAL"/>          <!-- 對(duì)于批量更新操作緩存SQL以提高性能 BATCH,SIMPLE -->         <!-- <setting name="defaultExecutorType" value="BATCH" /> -->          <!-- 數(shù)據(jù)庫(kù)超過(guò)25000秒仍未響應(yīng)則超時(shí) -->         <!-- <setting name="defaultStatementTimeout" value="25000" /> -->          <!-- Allows using RowBounds on nested statements -->         <setting name="safeRowBoundsEnabled" value="false"/>          <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java 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語(yǔ)句 -->         <setting name="logImpl" value="STDOUT_LOGGING" />   </settings>  </configuration>

      最后在需要緩存的映射文件mapper.xml的namespace加上引用的

      <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.krk.sxytj.ytj2001.mapper.YTJ2001Mapper" >   <cache type="com.krk.sxytj.utils.redis.MybatisRedisCache>

      然后就可以進(jìn)行測(cè)試了,測(cè)試時(shí)先進(jìn)行第一次查詢,如果開(kāi)啟打印sql,將會(huì)發(fā)現(xiàn)控制臺(tái)打印出剛才執(zhí)行查詢的SQL語(yǔ)句,再進(jìn)行同樣條件的查詢,這時(shí)注意觀察控制臺(tái),如果沒(méi)有打印SQL,直接輸出查詢結(jié)果,說(shuō)明是從Redis讀取到數(shù)據(jù)返回給你,而不是去數(shù)據(jù)庫(kù)中查詢得到的結(jié)果。此時(shí)配置就成功了。

      當(dāng)然,我們可以開(kāi)啟Redis客戶端和服務(wù)器端,在Redis安裝目錄下找到redis-cli,雙擊打開(kāi),輸入keys *回車,將會(huì)看到生成的key,Redis就是根據(jù)key去獲取所需的value。

      在實(shí)際操作的過(guò)程中要注意RedisUtil工具類,需要根據(jù)自己的情況設(shè)置port、ADDR 、如果安裝的Redis設(shè)置有密碼,還需加上AUTH,如果沒(méi)有設(shè)置密碼,這項(xiàng)不要添加在工具類中,哪怕賦空值也不行,

      曾經(jīng)試過(guò)這樣: private static String AUTH = " ";

      結(jié)果運(yùn)行的時(shí)候報(bào)了這個(gè)異常: jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

      意思就是redis服務(wù)器沒(méi)有設(shè)置密碼,但客戶端向其發(fā)送了AUTH請(qǐng)求。 此外,要緩存的類需要implements Serializable。 如果懷疑你安裝的Redis有問(wèn)題,可通過(guò)下面的方法進(jìn)行測(cè)試:

        @Test     public void testRedis(){          //連接本地的 Redis 服務(wù)         Jedis jedis = new Jedis("localhost");         System.out.println("連接成功");         //查看服務(wù)是否運(yùn)行         System.out.println("服務(wù)正在運(yùn)行: "+jedis.ping());         //設(shè)置 redis 字符串?dāng)?shù)據(jù)         jedis.set("success", "oobom");         // 獲取存儲(chǔ)的數(shù)據(jù)并輸出         System.out.println("redis 存儲(chǔ)的字符串為: "+ jedis.get("success"));     }

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)