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就可以@EnableTransactionManagementpublic class TransactionManagementConfiguration implements TransactionManagementConfigurer { @Autowired //注入DataSourceConfiguration裡面的dataSource 通過createDataSource擷取 private DataSource dataSource; /** * 關於交易管理 需要返回PlatformTransactionManager * * @return PlatformTransactionManager */ @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); }}
二、配置redis緩衝
我們下面的兩個類就是相關的redis緩衝工具類 JedisPoolWriper JedisUtil
在application.peoperties檔案中添加以下關於redis的相關配置
#redis緩衝的相關配置#hostredis.hostname=127.0.0.1#redis連接埠號碼 預設6379redis.port=6379redis.database=0redis.pool.maxActive=600redis.pool.maxIdle=300redis.pool.maxWait=3000redis.pool.testOnBorrow=true
類似資料連線池的建立,建立RedisConfiguration配置類
@Configurationpublic 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)@SpringBootTestpublic 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的相關之後並啟動之後再次運行時可以正常啟動並執行。 springboot測試專案地址 https://github.com/wuyinlei/springtest https://github.com/wuyinlei/springtest https://github.com/wuyinlei/springtest 相關連結文章 Mac環境下安裝Redis