Intellij IDEA 搭建Spring Boot專案(三)配置事務和Redis快取
阿新 • • 發佈:2019-02-09
Intellij IDEA 搭建Spring Boot專案 –>配置事務和Redis快取
標籤(空格分隔): SpringBoot JAVA後臺
一、開始配置事物
類似我們前一篇配置spring-dao的時候,我們可以看見在ssm中配置事物的時候是如下配置的
//這個不需要我們在進行配置 因為當我們@Configuration的時候 會全package掃描的
<!-- 掃描service包下所有使用註解的型別 -->
<context:component-scan base-package="com.ruolan.o2o.service" />
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入資料庫連線池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基於註解的宣告式事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
因此我們需要建立一個TransactionManagementConfiguration類
@Configuration
//首先使用註解@EnableTransactionManagement 開啟事務支援後
//在Service方法上新增@Transactional就可以
@EnableTransactionManagement
public class TransactionManagementConfiguration implements TransactionManagementConfigurer {
@Autowired
//注入DataSourceConfiguration裡面的dataSource 通過createDataSource獲取
private DataSource dataSource;
/**
* 關於事務管理 需要返回PlatformTransactionManager
*
* @return PlatformTransactionManager
*/
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource);
}
}
二、配置redis快取
我們下面的兩個類就是相關的redis快取工具類
在application.peoperties檔案中新增以下關於redis的相關配置
#redis快取的相關配置
#host
redis.hostname=127.0.0.1
#redis埠號 預設6379
redis.port=6379
redis.database=0
redis.pool.maxActive=600
redis.pool.maxIdle=300
redis.pool.maxWait=3000
redis.pool.testOnBorrow=true
類似資料連線池的建立,建立RedisConfiguration配置類
@Configuration
public class RedisConfiguration {
@Value("${redis.hostname}")
private String hostname;
@Value("${redis.port}")
private int port;
@Value("${redis.database}")
private int database;
@Value("${redis.pool.maxActive}")
private int maxActive;
@Value("${redis.pool.maxIdle}")
private int maxIdle;
@Value("${redis.pool.maxWait}")
private long maxWait;
@Value("${redis.pool.testOnBorrow}")
private boolean testOnBorrow;
@Autowired
private JedisPoolConfig jedisPoolConfig;
@Autowired
private JedisPoolWriper jedisPoolWriper;
@Autowired
private JedisUtil jedisUtil;
@Bean(name = "jedisPoolConfig")
public JedisPoolConfig createJedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//控制一個pool可以分配的多少個jedis例項
jedisPoolConfig.setMaxTotal(maxActive);
//連線池中最多可空閒的maxIdle個連線 這裡取值20
//表示即使沒有資料庫連線時候依然可以保持20個空閒的連線 而不被清除 隨時處於待命狀態
jedisPoolConfig.setMaxIdle(maxIdle);
//最大等待時間:當沒有可以用的連線的時候 連線池等待連線被歸還的最大時間(以毫秒技術) 超過時間則丟擲異常
jedisPoolConfig.setMaxWaitMillis(maxWait);
//在獲取連線的時候檢查有效性
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
return jedisPoolConfig;
}
@Bean(name = "jedisPoolWriper")
public JedisPoolWriper createJedisPoolWriper() {
JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
return jedisPoolWriper;
}
/**
* 建立Redis工具類 封裝好Redis的連線以進行相關操作
*
* @return
*/
@Bean(name = "jedisUtil")
public JedisUtil createJedisUtil() {
JedisUtil jedisUtil = new JedisUtil();
jedisUtil.setJedisPool(jedisPoolWriper);
return jedisUtil;
}
@Bean(name = "jedisKeys")
public JedisUtil.Keys createJedisKeys() {
JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
return jedisKeys;
}
@Bean(name = "jedisStrings")
public JedisUtil.Strings createJedisStrings() {
JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
return jedisStrings;
}
@Bean(name = "jedisLists")
public JedisUtil.Lists createJedisLists() {
JedisUtil.Lists jedisLists = jedisUtil.new Lists();
return jedisLists;
}
@Bean(name = "jedisSets")
public JedisUtil.Sets createJedisSets() {
JedisUtil.Sets jedisSets = jedisUtil.new Sets();
return jedisSets;
}
@Bean(name = "jedisHash")
public JedisUtil.Hash createJedisHash() {
JedisUtil.Hash jedisHash = jedisUtil.new Hash();
return jedisHash;
}
}
上述兩個類(事務和Redis配置類)的目錄結構圖如下圖所示:
我們在service裡面這樣使用Redis快取,程式碼如下:
@Autowired
private JedisUtil.Strings jedisStrings;
// Redis的安裝和配置 啟動之後再來執行這個是可以的 也就是走快取了
// https://www.jianshu.com/p/6b5eca8d908b
@Autowired
private JedisUtil.Keys jedisKeys;
@Autowired
private AreaDao areaDao;
private static String AREALISTKEY = "arealist";
@Override
public List<Area> getAreaList() throws IOException {
String key = AREALISTKEY;
List<Area> areaList = null;
ObjectMapper mapper = new ObjectMapper();
//判斷是否有快取
if (!jedisKeys.exists(key)) {
//沒喲快取 則查詢資料庫
areaList = areaDao.queryArea();
String jsonString = mapper.writeValueAsString(areaList);
jedisStrings.set(key, jsonString);
} else {
//有快取 這個時候從快取中通過key獲取到快取的資料 然後轉換為我們需要的資料
String jsonString = jedisStrings.get(key);
JavaType javaType = mapper.getTypeFactory()
.constructParametricType(ArrayList.class, Area.class);
areaList = mapper.readValue(jsonString, javaType);
}
return areaList;
}
測試service
//測試類加入如下的兩個註解
@RunWith(SpringRunner.class)
@SpringBootTest
public class AreaServiceTest {
@Autowired
private AreaService areaService;
// Redis的安裝和配置 啟動之後再來執行這個是可以的 也就是走快取了
// https://www.jianshu.com/p/6b5eca8d908b
@Test
public void testGetAreaList() throws IOException {
List<Area> areaList = areaService.getAreaList();
System.out.println("查詢出來的地區集合的個數是:" + areaList.size());
}
}
我們看下輸入的結果:
三、遇到的bug
剛開始沒了解redis是什麼,只是感覺是是一個快取,並沒想到需要各種配置–>導致沒有沒有開啟redis–server,在測試的時候會報
Could not get a resource from the pool
的錯誤,在配置好redis的相關之後並啟動之後再次執行時可以正常執行的。