Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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_Mysql_Database_Playframework - Fatal编程技术网

Java 将数据从数据库移动到静态文件、运行时变量

Java 将数据从数据库移动到静态文件、运行时变量,java,mysql,database,playframework,Java,Mysql,Database,Playframework,我正在使用playframework 1.2.4和mysql数据库 我在数据库中有一些表,但它们是静态的。大约有100-300条4-7键的记录。 我想把它们移出数据库 在这种情况下,存储信息的最佳位置是什么 新的播放配置文件 有解析器的某种XML 从playframework/java访问JSON/YAML文件(id不知道它是什么:) 在一个类中存储所有信息的Java文件 最好的解决方案是什么?在这种情况下,playframework宣扬的是什么?我仍然将其保存在DB中。您所称的“静态”数据

我正在使用playframework 1.2.4和mysql数据库

我在数据库中有一些表,但它们是静态的。大约有100-300条4-7键的记录。 我想把它们移出数据库

在这种情况下,存储信息的最佳位置是什么

  • 新的播放配置文件
  • 有解析器的某种XML
  • 从playframework/java访问JSON/YAML文件(id不知道它是什么:)
  • 在一个类中存储所有信息的Java文件

最好的解决方案是什么?在这种情况下,playframework宣扬的是什么?

我仍然将其保存在DB中。您所称的“静态”数据是一种基本数据,几乎不会发生变化,任何数据的最佳位置都是数据库


如果将其从DB移到静态文件中,您将不会真正获得任何优势。现在,您将有两个地方存放数据—数据库和静态文件,从长远来看,这将更易于维护。

我将您的选项分为以下几类:

  • 关系数据库
  • XML或JSON(无论是配置文件还是其他单独的文档)
  • 外部内存缓存,例如(也可从播放中获得)
  • 将数据存储为Java数据对象或use,后者将数据存储在Java堆中 这里需要处理两个问题:1.)访问数据的性能,2.)数据集的可维护性。我们可以单独处理这些问题

    性能

    关于性能,您有两个考虑因素。第一个是访问/延迟时间,第二个是存储在内存中的数据量。关于访问时间,数据库肯定会有最大的延迟。数字2和3将根据您的硬件和操作系统的不同而有所不同——您需要在特定的设置中进行一些测试,以真正确定哪种性能最好。从磁盘检索XML/JSON文件肯定比从内存缓存中访问要慢得多,但操作系统通常也非常智能,能够将频繁访问的文件保存在内存中。使用缓存系统的开销最终可能会比只使用静态文件慢

    您的数据最终需要成为Java对象,以便从代码中与之交互。因此,#1、2和3都需要将外部数据序列化到Java对象中,这需要一些时间。访问Java变量(#4)将是最快的,因为它不需要额外的序列化

    关于存储在内存中的数据量,#2和#4将要求您在每次运行代码时(即加载任何相关页面)将整个数据集存储在内存中。对于7x300值(8kB,如果它们都是浮点数),这可能不是一个很大的问题,但是当您期望一台服务器为数千个客户端提供服务时,每个页面加载上使用的额外内存消耗实际上可能会成为应用程序的瓶颈。如果能够静态存储数据,则可以降低此成本。选项#3将只在内存中存储一次数据,然后在所有请求中共享数据,这不应该是一个很大的内存损失#1的功能可能类似于#3(最坏情况下),因为它将在内存中全局存储一个副本。这些方法将数据的一个全局副本存储在内存中,然后只将相关代码序列化为Java对象(可能是数据集的一行)

    最后,请注意,使用Play内部的基于Java的缓存的缺点是它会降低可伸缩性。请务必阅读详细信息

    维护

    另一个问题是维护数据有多困难。听起来您反对基于RDBMS的解决方案是因为维护和部署方面的考虑。Memcached可能不会在数据库上为您提供太多,因为您仍然需要确保部署环境中缓存的一致性。在这一点上,剩下的选项是2和4。在我看来,使用存储在XML或JSON中的数据集要比使用Java容易得多,因此我认为基于XML的数据集在可维护性方面具有优势

    结论


    因此,维护和部署的最佳解决方案可能是XML,而性能最好的解决方案可能是基于Java的对象。谢天谢地,我们可以使用一种工具来充分利用这两个世界。允许您将POJO(Java对象)转换为XML并返回。因此,您可以用XML维护数据,然后在对数据集进行更改时,使用PojoXML将该文档转换为Java对象。然后,您将获得将静态数据保存在编译的Java代码中的性能优势,以及使用XML的可维护性。只需确保数据以静态方式存储,这样就不会在每次页面加载时消耗8kB的内存。

    由于您的数据量不太大,而且数据是静态的,那么最简单的方法,我认为也是最有效的方法,就是将数据作为哈希表实例传输到java项目。在应用程序启动时初始化此表,并在必要时使用它。

    您试图通过将数据移出数据库来解决的问题是什么?要取消使用数据库,不需要它。我只是偶尔更改一次静态数据。如果没有特定的内存限制,我会将对象加载到HashMap(或类似容器)中,然后使用Java二进制序列化将整个数据块序列化到磁盘。然后在启动时将其反序列化回内存。使用Xml的建议有一个优点,即您可以使用文本编辑器手动编辑数据,但听起来似乎您不需要这样做。感谢您的回答,但是:首先,我更担心在数据库中丢失数据,而不是重新发布版本的文件。我的意思是把数据从数据库中移开,这样就没有数据了