繁体   English   中英

在服务器内存中存储Java对象

[英]Storing java objects in server memory

我得到了一个处理多个对象的Java Web项目(再次包含n个类型为A的对象(例如,时间和值)和m个类型为B的对象(例如,时间和字符串数组)。 Web项目本身包含多个用于可视化的servlet / jsps以及一些用于数据处理的逻辑,并且当前在Apache Tomcat上运行。

在服务器运行时,是否可以将整个数据存储在服务器(或大部分时间:本地)中? 如果Tomcat关闭,则数据可以存储在一个简单的文件中,那里没有任何限制。 在服务器启动时,我只想读取文件并将对象写入内存。 我该如何启动Tomcat?

我不想使用额外的数据库的原因是,我想提供一个包含tomcat的zip文件,其中包括已部署的* .war文件(因为我不希望我的教授陷入tomcat服务器设置等问题)。

谢谢,ChrisH

您可以实现ServletContextListener并在分别在webapp的启动和关闭期间调用的contextInitialized()contextDestroyed()方法中编写从文件加载和保存到文件的逻辑。

您可以在磁盘上读写对象,但是它们都需要首先实现java.io.Serializable 这是带有代码示例的序列化教程

就是说,您是否考虑过嵌入式数据库,从而无需安装数据库服务器? 您可以为此使用JDK6的内置JavaDB或它的竞争对手HSQLDB 另外,如果它们是纯键-值对,那么您也可以为此使用java.util.Properties API( 此处是教程 )。 只需将propertiesfile放在类路径中的某个位置,然后使用ClassLoader#getResourceAsStream()来获取它的InputStream ,或者将其放在WEB-INF某个位置,然后使用ServletContext#getResourceAsStream()

我认为HSQLDB正是您所需要的,这是一种小型数据库服务器,它也原生嵌入在Apache Tomcat中。 它将数据存储在内存中,还可以从文件中写入和读取内容。

如果应用程序意外关闭,您将丢失所有数据,因为它没有时间将其写入磁盘。

您可以使用SQLite / derby / hsql等数据库将其数据存储到文件系统中。

如果您不想弄乱数据库,则可以将所有内容存储在内存中,并在每次修改时将其刷新到磁盘上。 这里有几个提示:

  • 序列化可以使这一过程变得非常容易。 使所有对象实现可序列化,并为其提供序列号ID
  • 写入磁盘时使用BufferedOutputStream,这比直接的FileOutputStream更快
  • 不要直接覆盖旧的数据文件! 写入新文件,完成写入后,将完成的文件移到旧文件的顶部。 这样,如果在编写数据文件的过程中服务器关闭,那么您仍然拥有之前编写的良好文件。
  • 您应该在写入数据时获得对数据的读取锁定。 任何其他修改数据的代码都应在数据上获得写锁定。

如果您不关心应用程序可能乱写所有数据文件,Tomcat / JVM崩溃或计算机可能丢失所有内存中对象而死的可能性,那么可以按照建议的方式管理持久性。 但是您将拥有大量的基础架构来构建,测试和维护。 而且您会错过大多数RDBM提供的“增值”工具。 备份,查询工具,优化器,复制等。

但是,如果灾难性的数据丢失不是您的选择,则应使用RDBM,ODBM来保持持久性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM