2016-08-16 46 views
1

創建用戶功能:如何更新在Java Spring框架的高速緩存上創建新條目

@Autowired private org.springframework.cache.CacheManager cacheManager; 
public boolean createUser(Users user,HttpSession session) { 
    System.out.println("cache update changed"); 
    Cache c = cacheManager.getCache("defaultCache"); 
    if (c != null) { 
     System.out.println("hello"); 
     c.put("",user.getUsername()); 
     // this code is not working 
    } 

    //BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(user); 

    MapSqlParameterSource params=new MapSqlParameterSource(); 
    params.addValue("username", user.getUsername()); 
    params.addValue("user_session_id", session.getId()); 
    java.util.Date today = new java.util.Date(); 
    //params.addValue("message_time",new java.sql.Timestamp(today.getTime())); 

    params.addValue("user_last_activity_time", new java.sql.Timestamp(today.getTime())); 

    jdbc.update("insert into users (username,user_session_id,user_last_activity_time) values (:username,:user_session_id,:user_last_activity_time)", params);// == 1; 

    //c.clear(); 
    //return user; 
    return true; 
} 

得到用戶的功能:

@Cacheable(value="defaultCache") 
//@CachePut(value="defaultCache") 
public List<Users> getOnlineUsers() { 
    System.out.println("DB Query"); 
    return jdbc.query(sql, new RowMapper<Users>() { 
     @Override 
     public Users mapRow(ResultSet rs, int rowNumb) throws SQLException { 
      Users user = new Users(); 
      user.setId(rs.getInt("id")); 
      user.setUsername(rs.getString("username")); 
      return user; 
     } 
    }); 
} 

請幫助我,我怎麼可以創建新的用戶更新緩存所以當我從List<Users> getOnlineUsers()函數通過jquery json函數得到用戶時,我應該得到更新的緩存。謝謝

+0

首先格式化您的代碼。 –

+0

你緩存包含用戶的列表,你試圖「放」一些用戶名.. – 2016-08-17 08:40:35

回答

0

您將不得不使用@CacheEvict註釋。

@CacheEvict("defaultCache") 
public boolean createUser(Users user, HttpSession session) { 
.... 
+0

我已經嘗試註釋@CacheEvict它不工作..它仍緩存陳舊的緩存 – user6282252

0

這樣做的確切方法將取決於加載所有用戶的成本和用戶創建的次數。

你基本上有兩種選擇:

  • 基於失效:創建用戶時不更新緩存,而不是無效的映射。由於您使用的是Spring,因此我建議您通過Spring caching annotation @CacheEvict這樣做,以便它在創建用戶的事務之外發生。
  • 手冊:繼續沿着你開始的路徑走,但你必須做的是從緩存中獲取用戶的集合,併爲它添加新的User。然後將該映射放回緩存中。爲此,您需要確定Spring緩存用作默認密鑰的內容,或者在getOnlineUsers@Cacheable註釋中指定一個密鑰。
+0

我已經嘗試註釋@CacheEvict它不工作.. – user6282252

+0

用你當時的嘗試擴展你的問題。沒有細節,很難說出什麼問題。 –

0

您還可以在創建新條目的方法上使用@CachePut。返回類型必須與@Cachable方法中的返回類型相同。

@Service 
public class CacheService { 

    public static final String KEY = "THE_KEY"; 

    @CachePut(cacheNames = {"defaultCache"}, key = "#root.target.KEY") 
    public List<Users> createUser { 
    // create user and return all users 
    ... 
    } 

    @Cacheable(cacheNames = {"defaultCache"}, key = "#root.target.KEY") 
    public List<Users> getOnlineUsers() { 
    // return all users 
    ... 
    } 
} 

正如你所看到的,我也使用cacheNames和key作爲key。通常情況下,您使用該鍵的方法的參數。如果參數不同或沒有參數,您可以在這裏使用'public static final'鍵。

在需要的地方注入服務並調用方法。

@Autowire 
CacheService cacheService; 

... 

希望這會有所幫助。