2012-11-27 16 views
5

Tôi thấy anorm không phải là khung ORM, nó đang truy vấn trực tiếp dữ liệu bằng SQL. Đối với hầu hết các ứng dụng/trang web, chúng ta không nên truy vấn cơ sở dữ liệu mọi lúc, chúng ta cần lưu trữ dữ liệu bằng SQL hoặc id mục. Tôi tự hỏi liệu playframework có cung cấp bất kỳ loại cơ chế lưu trữ nào không? Nếu không làm thế nào để thêm nó?Cách thêm cơ chế bộ đệm khi sử dụng anorm trong Playframework

Cảm ơn.

Trả lời

10

Bạn có thể sử dụng bộ nhớ cache Chơi trong điều khiển của bạn, trước khi truy vấn cơ sở dữ liệu của bạn. Dưới đây là một ví dụ đơn giản có nguồn gốc từ Play cache documentationScala API:

val user: User = Cache.getOrElse[User](key = "user" + userId, expiration = 10) { 
    User.findById(userId) 
} 

Trong mã này, trước khi cố gắng để truy vấn cơ sở dữ liệu, chúng tôi làm một tra cứu trong bộ nhớ cache để kiểm tra xem người dùng đã không được nạp trước đó. Nếu không tìm thấy trong bộ nhớ cache, chúng tôi lưu trữ nó trong bộ nhớ cache với thời gian hết hạn sau 10 giây.

+0

+1, nhưng bộ nhớ cache 10 giây? Tôi đã đi với 2 phút đến 24 giờ cá nhân. Bạn không chắc chắn liệu có một điểm giảm dần trong việc đặt thời gian hết hạn bộ nhớ cache rất thấp hay không. – virtualeyes

+0

Chắc chắn, nó chỉ là ví dụ –

0

Giả sử bạn đang sử dụng khung công tác Play2, nó thực sự cung cấp cơ chế bộ nhớ cache. Nó có tài liệu tốt đẹp ở đây:

http://www.playframework.org/documentation/2.0/JavaCache (gọi tắt là javacache của nó, nhưng nó hoạt động từ Scala)

+0

Cảm ơn trả lời của bạn. Tôi thấy nó từ tài liệu chơi, nó đang sử dụng ehcache, nhưng nó không được tích hợp với anorm, nó không dễ sử dụng để lưu trữ kết quả truy vấn, tôi tự hỏi nếu Playframework cung cấp một cách để làm điều đó. Nếu ai đó đã triển khai bộ nhớ cache, nó cũng sẽ giúp – Simon

6

Bạn có thể chỉ cần lưu lại câu trả lời của các phương thức Anorm. Ví dụ: phương pháp thực mà tôi sử dụng:

def findById(id: Long): Option[User] = { 
    Cache.getOrElse(userCacheKey + id, 60*60) { 
     DB.withConnection { 
     implicit connection => 
      SQL("select * from publisher where id = {id}").on('id -> id).as(User.simple.singleOpt) 
     } 
    } 
} 

Mã sẽ chọn và lưu trữ câu trả lời trong bộ nhớ cache qua getOrElse. Nếu giá trị nằm trong Cache, nó sẽ được nhận và không có truy vấn nào được thực thi.

Vấn đề duy nhất là khi bạn cập nhật các thực thể tài khoản bạn sẽ phải cập nhật bộ nhớ cache (vì vậy nó không giữ dữ liệu cũ):

// Assumes a user: User object available with the updated user 
Cache.set(userCacheKey + id, cached.copy(name = user.name, avatar = user.avatar, bio = user.bio, url = user.url, location = user.location), 60*60) 
+0

Cùng một câu trả lời cùng một lúc :-) –

+0

haha ​​yeah, hơi khác khi tôi lưu nó trong Anorm, bạn trong người gọi, nhưng về cơ bản giống nhau :) –

+0

cảm ơn các bạn, cách tiếp cận này đã làm việc, nhưng cần quá nhiều mã hóa và nó nhúng vào mã kinh doanh. Tôi hy vọng cơ chế bộ nhớ cache nên là một khung chung để người dùng cuối chỉ quan tâm đến logic truy vấn, nhưng không phải là bộ nhớ cache và bộ nhớ cache bị vô hiệu. Nó sẽ là hoàn hảo nếu anorm có thể làm điều này cho tôi :) – Simon