我使用的是PlayFramework1.2.4和mysql数据库。
我在DB中有一些表,但它们是非常静态的。大约有100到300条4-7键的记录。我想把他们从数据库里移开。
在这种情况下,储存信息的最佳地点是什么?
在这种情况下,什么是最好的解决方案?
发布于 2012-04-19 23:11:13
我将把你的选择分为以下几个方面:
您需要在这里处理两个问题:1)访问数据的性能,以及2.)数据集的可维护性。我们可以分开处理。
性能
您有两个关于性能的考虑。第一个是访问/滞后时间,第二个是存储在内存中的数据量。在访问时间方面,数据库一定会有最大的滞后。数字2和3将根据您的硬件和操作系统而有所不同--您需要在您的特定设置中进行一些测试,以确定哪一个性能最好。从磁盘中检索XML/JSON文件肯定比从内存中缓存访问它要慢得多,但是操作系统通常也非常聪明地将频繁访问的文件保存在内存中。可能是使用缓存系统的开销比仅仅使用静态文件慢。
您的数据最终需要成为Java对象,以便通过代码与其进行交互。因此,#1、2和3都需要将外部数据序列化为Java对象,这需要一定的时间。访问Java变量(#4)将是最快的,因为它不需要额外的序列化。
关于存储在内存中的数据量,#2和#4将要求您在每次运行代码时(即加载任何相关页)将整个数据集存储在内存中。对于7×300值(如果它们都是浮动的话),这可能不是什么大问题,但是当您期望一台服务器为数千个客户端服务时,每个页面负载上使用的额外内存消耗实际上可能会成为应用程序的瓶颈。如果您能够静态地存储数据,则可以降低此成本。选项3只将数据存储在内存中一次,然后在所有请求之间共享数据,这不应该是很大的内存损失。#1的功能可能类似于#3 (最坏的情况),因为它将在全局内存中存储一个副本。这些方法将将数据的一个全局副本存储在内存中,然后只将相关代码序列化为Java对象(可能是数据集的一行)。
最后,请注意,使用Play的内部、基于Java的缓存的缺点是,它会花费您的可伸缩性。一定要阅读细节这里。
维护
另一个问题是,对您来说,维护这些数据有多困难。听起来,由于维护和部署问题,您反对基于RDBMS的解决方案。Memcached可能不会为您提供比数据库更多的服务,因为您仍然需要确保整个部署环境中缓存的一致性。在我看来,使用存储在XML或JSON中的数据集要比使用Java容易得多,所以我认为,在可维护性方面,使用基于XML的数据集有好处。
结论
因此,维护和部署的最佳解决方案可能是XML,性能最好的是基于Java的对象。谢天谢地,我们可以使用一个工具来充分利用这两个世界。PojoXML允许您将POJO (Java )转换为XML。因此,您可以使用XML维护数据,然后在对数据集进行更改时使用PojoXML将该文档转换为Java对象。然后,通过使用XML的可维护性,在编译后的Java代码中保持静态数据的性能优势。只需确保以静态方式存储数据,这样您就不会在每次加载页面时消耗8kB内存。
发布于 2012-04-01 11:55:39
我还是会把它留在DB里。您所称的“静态”数据是一种几乎不发生变化的主数据,任何数据的最佳位置都是数据库。
如果将它从DB移到静态文件中,就不会真正获得任何优势。现在您将有两个位置用于您的数据-数据库和静态文件,这将是更多的维护,从长远来看。
发布于 2012-04-23 07:36:17
由于您的数据量不太大,而且数据是静态的,那么最简单的方法,我认为也是最有效的方法,就是将您的数据作为Hashtable实例传输到您的java项目。在应用程序启动时初始化此表,并在必要时使用它。
https://stackoverflow.com/questions/9955867
复制相似问题