在启动时检索所有重要数据

时间:2011-02-09 16:23:12

标签: java database java-ee


在Java Web应用程序中,我想知道它是否是一个正确的(或“标准”?)方式,所有基本数据,如配置数据,消息数据,代码维护数据,下拉选项数据等(假设所有数据都不会经常更新)在服务器启动时作为“静态”变量从数据库加载。

或者通过查询每个请求的数据库来检索数据是更优选的方法吗?

感谢您的所有建议。

2 个答案:

答案 0 :(得分:2)

将应用程序生命周期中不会被修改的所有数据提取出来并将其作为单例或其他内容保存在内存中是完全有效的。

这是一个好主意,因为它可以节省数据库命中率并且检索速度更快。许多环境特定的设置和其他数据也可以被拉出一次,并保存在不可变的hashmap中,以备将来的任何请求。

在一个常见的网络应用程序中,你通常没有那么多的配置数据/选项对象会占用大量内存并导致OOM。但是,如果您有一个包含数十万个配置数据的表,那么最好假设在请求时提取对象。如果你想把它保存在内存中,可以考虑把它放在像MemcacheD这样的键值存储中。

答案 1 :(得分:0)

我们使用DB存储配置值和ehcache以避免大量数据库命中。这样你就不必担心内存消耗(它将使用你拥有的任何内存)。

EhCache是​​众多可用的数据库缓存解决方案之一,可以在JPA等之上进行配置。

您可以配置ehcache(或许多其他缓存提供程序)以将表视为只读,在这种情况下,只有在明确告知缓存无效时,它才会转到数据库。这表现得很好。虽然读取非常频繁地发生(例如100 /秒),但开销变得可见,但通常将配置值存储在局部变量中并避免读取内部循环,在调用期间通过方法堆栈传递它可以很好地缓解这一点。 / p>

将值存储在Singleton中作为java对象执行效果最佳,但是如果要在没有app的情况下修改它们。启动,它变得有点参与。

这是使用Java对象实现动态配置的简单方法:

private volatile ImmutableMap<String,Object> param_value

基本上你必须开始考虑多线程访问和内存问题(虽然由于配置值,你不太可能会耗尽内存,除非你有二进制数据作为配置值等)。

从本质上讲,我建议使用数据库和一些缓存提供程序,除非这部分代码确实需要高性能。