为什么使用数据库而不是单例 bean 字段?
Why use a database instead of singleton bean fields?
我的用例是一个实时 Spring MVC 应用程序,它可以快速处理少量非关键数据 "churns"。数据由大约 20 个键值字符串对组成。它按计划从外部 API 拉入,可以由与 webapp 交互的最终用户修改,并用于在 POST 中为另一个外部 API 生成参数时间表。
这可能非常明显,也许太明显以至于我无法在任何地方找到答案,但基本上为什么我要将数据保存在数据库中而不是使用线程安全的专用单例 class诸如 ConcurrentHashMap 之类的字段,然后将其注入到任何需要它的 @Services 中?我最初的感觉是 class 这样的 read/writes 甚至比内存数据库更快,但是我看到的每个示例都依赖于 "proper" 数据库:
@Repository
public class DataStore{
private Map data = new ConcurrentHashMap<String, String>();
//...getters and setters etc..
}
感谢任何想法!
您可以使用 ConcurrentMap 将 key/value 对存储在内存中,这没有任何问题。
但是 "proper" DB 主要为您提供持久性,当您重新启动应用程序时,数据仍然存在。 DB 还为您提供原子性,而 Map 本身没有(但是可以通过简单的锁定添加)。
这基本上取决于您希望它有多可靠。 Guava Cache may be probably also worth consideration. Note that this solution will not scale - you won't be able to deploy multiple instances as each of them will have isolated "DataStore" singletons. You can also think of memcached 或类似的东西。
我的用例是一个实时 Spring MVC 应用程序,它可以快速处理少量非关键数据 "churns"。数据由大约 20 个键值字符串对组成。它按计划从外部 API 拉入,可以由与 webapp 交互的最终用户修改,并用于在 POST 中为另一个外部 API 生成参数时间表。
这可能非常明显,也许太明显以至于我无法在任何地方找到答案,但基本上为什么我要将数据保存在数据库中而不是使用线程安全的专用单例 class诸如 ConcurrentHashMap 之类的字段,然后将其注入到任何需要它的 @Services 中?我最初的感觉是 class 这样的 read/writes 甚至比内存数据库更快,但是我看到的每个示例都依赖于 "proper" 数据库:
@Repository
public class DataStore{
private Map data = new ConcurrentHashMap<String, String>();
//...getters and setters etc..
}
感谢任何想法!
您可以使用 ConcurrentMap 将 key/value 对存储在内存中,这没有任何问题。 但是 "proper" DB 主要为您提供持久性,当您重新启动应用程序时,数据仍然存在。 DB 还为您提供原子性,而 Map 本身没有(但是可以通过简单的锁定添加)。
这基本上取决于您希望它有多可靠。 Guava Cache may be probably also worth consideration. Note that this solution will not scale - you won't be able to deploy multiple instances as each of them will have isolated "DataStore" singletons. You can also think of memcached 或类似的东西。