将java对象存储在服务器内存中

时间:2009-11-25 02:41:31

标签: java memory tomcat

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

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

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

谢谢,ChrisH

4 个答案:

答案 0 :(得分:5)

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

您可以读取和写入磁盘对象,但它们都需要先实现java.io.Serializable。这是一个带有代码示例的Serialization tutorial

那就是说,您是否考虑过嵌入式数据库,这样您就不需要安装数据库服务器了?您可以将JDK6的内置JavaDB用于此竞争对手HSQLDB。或者,如果它是纯键值对,那么您也可以使用java.util.Properties API(tutorial here)。只需将属性文件放在类路径中的某个位置,然后使用ClassLoader#getResourceAsStream()获取InputStream,或将其放在WEB-INF中的某个位置并使用ServletContext#getResourceAsStream()

答案 1 :(得分:3)

我认为HSQLDB正是您所需要的,一个小型数据库服务器,本身也嵌入在Apache Tomcat中。它将数据存储在内存中,允许从文件中写入和读取内容。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

但是,如果灾难性的数据丢失不适合你,你应该使用RDBM,ODBM,无论你做什么都持久。