[英]Java thread safe heavy object, advice needed
您在此处引用的设计模式是一个cache
。
如果数据是相对静态的,则可以某种方式缓存数据库响应,也许在Map
,其中包含根据请求的参数构建的某种键,并且可能基于时间(例如1小时或1天)而到期。
Singleton
确实是可共享对象(例如所需的缓存)的实现。 请注意,您引用的另一个答案是关于线程安全的。 这在(例如)Web服务环境中尤其重要,在该环境中,可以按会话或按请求使用线程。
注意,很多人认为Singleton是不好的编程习惯,尤其是因为它们很难测试。
因此,实现缓存的另一种方法是通过单例线程安全的缓存bean
,并将其“连接”到需要通过依赖关系注入使用的所有位置。
PS。 番石榴库具有一个缓存构建器,可以使用基于时间的过期策略对其进行配置。
PPS。 如果要跨多个服务器缓存,可以考虑使用像hazelcast
这样的网格解决方案。
如果您的数据经常读取但不经常更改(甚至是静态的),那么cqengine是您的朋友
如果您不介意某些“用户”受到数据库的欢迎,则可以通过以下简单的缓存来摆脱困境:
import java.util.concurrent.atomic.AtomicLong;
public class DbData {
AtomicLong lastVisistToDB = new AtomicLong();
volatile Object dataFromDb;
long freshnessInterval = 1000 * 60; // 1 minute
public DbData() {
getFromDb();
}
Object getData() {
if(System.currentTimeMillis() - lastVisistToDB.get() > freshnessInterval) {
getFromDB();
}
return dataFromDb;
}
private void getFromDb() {
dataFromDb = getDataFromDb(...);
lastVisistToDB.set(System.currentTimeMillis());
}
}
请注意,如果多个“用户”要求提供的数据不是最新的-您将多次调用数据库。 但是,一旦发生这种情况,您就可以保持1分钟的好转或无论您设置的freshnessInterval
时间长短如何
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.