Java Web 应用程序应该在哪里存储它的数据?
Posted
技术标签:
【中文标题】Java Web 应用程序应该在哪里存储它的数据?【英文标题】:Where should a Java web application store its data? 【发布时间】:2011-03-10 18:35:57 【问题描述】:我的 Java Web 应用程序 (myapp.war
) 已通过将其放入 Ubuntu 10.04 上 Tomcat 上的 webapps
目录中进行部署。
此应用程序需要将一些数据保存在文件中。但是运行 Tomcat 的用户 (tomcat6
) 没有对主目录 /usr/share/tomcat6/
的写访问权,也没有对当前工作目录 /var/lib/tomcat6/
的写访问权,因为两者都属于 root
。
那么 Web 应用程序应该将其数据存储在哪里?我希望它不是 webapps 目录中提取的存档。这个很容易被意外删除。并且可以配置Tomcat,不要解压.war文件。那么就没有提取的目录了。
也许/var/lib/tomcat6/
应该属于用户tomcat6
ant 这是Ubuntu 中的一个错误?
【问题讨论】:
无法保证 Web 容器允许您使用文件系统... 您是在读取数据还是写入数据?通常,Web 应用程序不使用文件系统来保存数据,它们使用 DB、Web 服务或 JMS 队列分别与另一个系统同步或异步通信。 我需要读写数据。我有自己的存储框架,它对我来说比任何数据库都要好。 【参考方案1】:如果文件不需要超过 servlet 上下文的生命周期,则 servlet 容器为每个 servlet 上下文提供一个私有临时目录,由javax.servlet.context.tempdir
属性指定。
参见Servlet Specification 2.3,第 3 章 Servlet 上下文
3.7.1 临时工作 目录
临时的便利 每个存储目录都需要 servlet 上下文。 Servlet 容器 必须提供私人临时 每个 servlet 上下文的目录和 通过 javax.servlet.context.tempdircontext 属性。关联的对象 该属性必须是 输入 java.io.File
【讨论】:
【参考方案2】:回答他自己的问题时,Witek 表示/var/lib/tomcat6/webapps/ is writable
——至少在他安装他的 Ubuntu 版本时。在我的 RHEL 5.2 系统上,/var/lib/tomcat<X>
甚至不存在,因此没有可写的 webapps 子目录,这导致了我的答案。
问:Java Web 应用程序应将其数据存储在哪里?答:无论您已将其配置为存储其数据的位置。
使位置可配置,在 web.xml 中作为 <context-param>
或在 myApplication.properties 文件中。
【讨论】:
web.xml 中的配置在更新时会导致大问题。开发人员交付的每个新 .war 都会覆盖管理员配置。 读取自定义 myApplication.properties 文件会引发问题,我们要查找该文件。 在 Tomcat 上,使用 $CATALINA_BASE/conf 中 YourWebAppName.xml 文件的 Context 元素中的 Parameter、Environment 和 Resource 元素覆盖 web.xml context-param、env-entry 和 resource-ref 定义/[enginename]/[hostname]/ 目录(通常是 $CATALINA_BASE/conf/Catalina/localhost/)。有关上下文容器,请参阅 Apache Tomcat 文档。【参考方案3】:我认为这取决于您处理的数据类型。大多数情况下,数据进入数据库只是因为它快速且易于执行 CRUD。如果你想存储本地化的用户配置并且你不在乎它的便携性,也许你可以存储在user.home 下,我为我的一个项目做到了这一点,效果很好。话虽如此,我真的认为在这方面没有任何最佳实践,而数据库似乎是最明显的选择,因为您可以针对它执行很多不同的任务,而且其中大多数都是免费的。 :)
【讨论】:
【参考方案4】:我在 Launchpad 上找到了解决方案。 /var/lib/tomcat6/webapps/
是可写的。这意味着,以下工作:
File myFile = new File("webapps/myfile.txt");
【讨论】:
好的,但这可能不是一个可移植的解决方案(它适用于 Tomcat,但如果您在另一个 Java EE 应用服务器上运行您的 webapp,则可能无法正常工作)。 如果您更改工作目录(发出启动Tomcat命令的文件夹),它将不起作用。在 Java IO 中使用相对路径是一个糟糕的主意。而是在 Java IO 中使用绝对路径,例如/var/lib/tomcat6/webapps/myfile.txt
。
绝对路径会将我绑定到 Linux 上的 Tomcat。我想提供一个 .war 文件,只需将其放到几乎所有可能平台上的 webapps 目录即可。
那么不要写入文件系统,这是一个不可移植的解决方案(如果人们不能写入文件系统怎么办?集群怎么办?等等等等)。
在 servlet 中,使用 new File( getServletContext().getRealPath("/myfile.txt") ) 从应用程序上下文的相对路径中获取绝对路径。在 JSP 脚本中,您可以使用 application.getRealPath()【参考方案5】:
我还没有看到任何关于应将此类数据存储在本地何处的具体指导 - 可能是因为您通常会将此类数据存储在数据库中。
当我需要存储这样的快速而肮脏的数据时,我会将其存储在专门用于该数据的文件系统中,以将其与可能陷入其他活动的其他区域隔离开来。到目前为止,该方法没有任何问题。另外,如果它很重要,请确保将其存储在要备份的地方:)
【讨论】:
即使我将数据存储在数据库中,我也必须将数据库的访问数据存储在某个地方。 “访问数据”是什么意思? @Witek,Tomcat 可以通过 JNDI 提供预配置的 JDBC 数据源。这些配置在通常的 Tomcat 配置文件中。以上是关于Java Web 应用程序应该在哪里存储它的数据?的主要内容,如果未能解决你的问题,请参考以下文章
我应该在哪里存储我的 Xcode Swift 应用程序的初始数据?