我有一个java web项目处理几个对象(同样包含n个类型为A的对象(例如时间和值)和m个类型为B的对象(例如时间和字符串数组))。 Web项目本身包含几个用于可视化的servlet / jsps以及一些用于数据操作的逻辑,并且当前在Apache Tomcat上运行。
在服务器运行时,是否可以将整个数据存储在服务器(或大多数时间:本地)内存中?如果Tomcat关闭,数据可以存储在一个简单的文件中,没有限制。在服务器启动时,我只想读入文件并将对象写入内存。如何启动Tomcat呢?
我不想使用额外数据库的原因是,我想提供一个包含tomcat的zip文件,包括已部署的* .war文件(因为我不希望我的教授陷入tomcat服务器设置等)
谢谢,ChrisH
答案 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等数据库将数据存储到文件系统。
如果您不想弄乱数据库,那么您可以将所有内容存储在内存中,并在每次修改时将其刷新到磁盘。这里有几个提示:
答案 3 :(得分:0)
如果您不关心您的应用程序可能会乱写您的数据文件,您的Tomcat / JVM可能会崩溃,或者您的计算机可能会丢失所有内存中的对象,然后按照您的建议管理持久性选项。但是你将拥有相当多的基础设施来构建,测试和维护。你会错过大多数RDBM提供的“增值”工具;备份,查询工具,优化器,复制等。
但是,如果灾难性的数据丢失不适合你,你应该使用RDBM,ODBM,无论你做什么都持久。