我正在使用playframework 1.2.4和mysql数据库。
我有一些DB中的表,但是非常静态。它是大约100-300个4-7键的记录。 我想将它们移出DB。
在这种情况下,存储信息的最佳位置是什么?
在这种情况下,什么是最佳解决方案以及playframework所宣传的内容?
答案 0 :(得分:3)
我仍然会把它保存在DB中。你所谓的“静态”数据是一种几乎没有变化的主数据,任何数据的最佳位置都是数据库。
通过将数据库移出静态文件,您无法获得任何优势。现在,您的数据有两个位置 - 数据库和静态文件,从长远来看,这将是更多的维护。
答案 1 :(得分:3)
我会将您的选项分组到以下内容中:
您有两个问题需要在此处理:1)访问数据的性能,以及2.)数据集的可维护性。我们可以单独处理这些问题。
<强>性能强>
关于性能,您有两个注意事项。第一个是访问/延迟时间,第二个是存储在内存中的数据量。关于访问时间,数据库肯定会有最大的滞后。数字2和3将根据您的硬件和操作系统而有所不同 - 您需要在特定设置中进行一些测试才能确定哪种测试效果最佳。必须从磁盘检索XML / JSON文件肯定比从内存缓存中访问它要慢得多,但操作系统通常非常聪明地将频繁访问的文件保存在内存中。可能是使用缓存系统的开销最终比仅使用静态文件慢。
您的数据最终需要成为Java对象才能与代码进行交互。因此,#1,2和3都需要将外部数据序列化为Java对象,这将花费一些时间。访问Java变量(#4)将是最快的,因为它不需要额外的序列化。
关于存储在内存中的数据量,#2和#4将要求您在每次运行代码时将整个数据集存储在内存中(即加载任何相关页面)。对于7 x 300值(8kB,如果它们都是浮点数),这可能不是一个大问题,但是当您期望单个服务器为数千个客户端提供服务时,在每个页面加载上使用的额外内存消耗实际上可能变为瓶颈适合您的应用。如果您能够静态存储数据,则可以减轻此成本。选项#3只会将数据存储在内存中一次,然后在所有请求中共享,这不应该是一个很大的内存损失。 #1可能会像#3(最坏的情况)一样运行,因为它会在全局内存一个副本。这些方法将一个全局数据副本存储在内存中,然后只将相关代码序列化为Java对象(可能是数据集的一行)。
最后,请注意使用Play的内部基于Java的缓存的缺点是它会降低您的可扩展性。请务必阅读详细信息here。
<强>维护强>
另一个问题是维护数据有多困难。由于维护和部署问题,听起来您反对基于RDBMS的解决方案。 Memcached可能不会为您提供太多的数据库,因为您仍需要确保跨部署环境的缓存一致性。那时,你留下了选项#2和#4。在我看来,使用存储在XML或JSON中的数据集比使用Java更容易,因此我认为在可维护性方面,基于XML的数据集会受益。
<强>结论强>
因此,维护和部署的最佳解决方案可能是XML,性能方面最好的是基于Java的对象。值得庆幸的是,我们可以使用工具来充分利用这两个方面。 PojoXML允许您将POJO(Java对象)转换为XML并返回。因此,您可以使用XML维护数据,然后在对数据集进行更改时使用PojoXML将该文档转换为Java对象。然后,通过使用XML的可维护性,您可以获得将静态数据保存在已编译的Java代码中的性能优势。只需确保以静态方式存储数据,这样就不会为每个页面加载消耗8kB的内存。
答案 2 :(得分:0)
由于您的数据量不是太大且数据是静态的,那么最简单的方法,我认为最有效的方法是将您的数据作为Hashtable实例传输到您的Java项目。在应用程序启动时初始化此表,并在必要时使用它。