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

问题描述 投票:0回答:4

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

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

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

谢谢克里斯H

java memory tomcat
4个回答
6
投票

您可以实现

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

您可以在磁盘上读取和写入对象,但它们都需要首先实现

java.io.Serializable
。这是序列化规范以及代码示例。

也就是说,您是否考虑过使用“嵌入式”数据库,以便无需安装数据库服务器?您可以使用 JDK6 的内置 JavaDB 或其竞争对手 H2。或者,如果它是纯键值对,那么您也可以使用 java.util.Properties

 API 来实现此目的(
教程在这里)。只需将属性文件放在类路径中的某个位置并使用 ClassLoader#getResourceAsStream()
 即可获取它的 
InputStream
,或者将其放在
WEB-INF
中的某个位置并使用
ServletContext#getResourceAsStream()


3
投票
HSQLDB

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


1
投票

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

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

序列化可以使这变得非常简单。让你的所有对象都实现 Serialized,并给它们一个序列化版本 id
  • 使用 BufferedOutputStream 时 写入磁盘,这比直接 FileOutputStream 更快
  • 请勿直接覆盖旧数据文件!写入新文件,写入完成后,将完成的文件移到旧文件的顶部。这样,如果服务器在您写入数据文件的过程中关闭,您仍然拥有之前写入的好文件。
  • 您应该在写入数据时获取数据的读锁。修改数据的任何其他代码都应该获得数据的写锁。

0
投票

但是,如果灾难性数据丢失不适合您,那么您应该使用 RDBM、ODBM 等来实现持久性。

© www.soinside.com 2019 - 2024. All rights reserved.