Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 参考数据模式_Java_Spring_Design Patterns_Static Data - Fatal编程技术网

Java 参考数据模式

Java 参考数据模式,java,spring,design-patterns,static-data,Java,Spring,Design Patterns,Static Data,与此线程类似,但不完全相同: 处理“参考数据”(应用程序经常读取的数据,通常外部化在数据库或属性文件中,但很少更新(天、周、月)的数据)的通常模式是什么?数据更新后,将在外部进行更新 这通常是一个我可以用DAO注入的单例,从而能够管理它自己的内容吗?我喜欢在这个服务上公开一个refresh()方法来强制刷新(例如,通过MBean,这样我就不必跳出应用程序) 从另一个SO线程来看,听起来人们可能只是在必要时实例化DAO,并在该级别上透明地缓存 我有点喜欢使用从数据库加载数据的真实DAO或返回硬编码

与此线程类似,但不完全相同:

处理“参考数据”(应用程序经常读取的数据,通常外部化在数据库或属性文件中,但很少更新(天、周、月)的数据)的通常模式是什么?数据更新后,将在外部进行更新

这通常是一个我可以用DAO注入的单例,从而能够管理它自己的内容吗?我喜欢在这个服务上公开一个refresh()方法来强制刷新(例如,通过MBean,这样我就不必跳出应用程序)

从另一个SO线程来看,听起来人们可能只是在必要时实例化DAO,并在该级别上透明地缓存

我有点喜欢使用从数据库加载数据的真实DAO或返回硬编码响应的模拟/测试双精度(mock/test double)注入singleton服务的想法。然而,如果我要通过JavaEnum将服务实现为一个单例,那么通过Spring将其连接起来就有点麻烦了


那么,其他人通常如何处理参考数据呢?随意查询,但要隐藏缓存?还是一个单独的内存服务?

我通常使用Spring将DAO实现注入到我的服务层,并且,正如您所提到的,除了基于SQL的实现之外,还经常有一个测试实现(
XMLDao
FlatFileDao
)。对于小型数据集,我通常编写自己的缓存,并将从底层表加载的所有数据存储在内存中

综上所述,我拥有使用相当小的数据集的优势。如果我处理一个更大的数据集,我可以考虑现成的缓存解决方案,可能分布在多个JVMs(like)上。 正如我在前面的线程中提到的,我还公开了一个refresh()方法。在数据更新不需要及时传播的情况下,我只需通过MBean手动调用它。在我希望实现自动化的情况下,我使用了Tibrv来侦听来自数据库的更新并刷新缓存数据(使用MS-SQL触发器生成Tibrv消息)


我不太理解您提到的使用Java Enum实现该服务——这是如何工作的?

我可能已经把这一部分弄糟了。主要是,我想知道如何将依赖注入到单例中。现在我想起来了,这可能是一个单独的问题。无论如何,根据Bloch的说法,目前在java中实现单例的最佳实践是使用具有单个成员(实例)的枚举:即public enum Elvis{instance;}如果您要走这条路,您是否仍然可以通过Spring使用MethodInvokingFactoryBean来调用enum类上的相关setter来注入任何依赖项?是的,这就是我最终可能会做的事情——但这不够优雅,我认为我应该回到第一原则,看看我是否做错了。Terracotta是一个集群解决方案,而不是缓存解决方案