繁体   English   中英

Java线程安全的重对象,需要建议

[英]Java thread safe heavy object, advice needed

我的客户基本上每5秒从我的应用程序请求相同的数据 目前,我正在为每个用户查询数据库,但这似乎不是一个有效的解决方案。

我正在考虑创建此答案中描述的线程安全单例, 单例将包含一个对象,并且该对象每隔几分钟刷新一次。

这是正确的道路,还是您有其他建议?

对我来说,这似乎是一个普遍的问题,我认为可能有一个现成的解决方案。

您在此处引用的设计模式是一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM