【问题标题】:Acceptable locations for a servlet to write to?servlet 写入的可接受位置?
【发布时间】:2012-12-07 22:43:46
【问题描述】:

我想在 Tomcat 上运行的基于 servlet 的应用程序中嵌入一个 Derby 数据库。

为此,我需要将数据库文件保存在磁盘上。我希望它们驻留在已部署 Web 应用程序的子文件夹中(然后我可以使用 getServletContext().getRealPath() 进行转换)。

在 servlet 可以安全写入的可接受的、与应用程序相关的位置上,是否有一个好的做法?如果不存在这样的建议,那么特定于 tomcat 的良好做法是什么?

This discussion似乎排除了写WebContent;我是否必须写信给CATALINA_HOME 子文件夹,正如一些教程所指出的那样(但感觉很老套)?

【问题讨论】:

  • 至于getRealPath() 问题,这很糟糕,因为无论何时重新部署 WAR,甚至重新启动自动重新部署现有 WAR 的服务器,您所做的任何更改都会丢失。原因很简单,这些更改根本不包含在原始 WAR 中。

标签: tomcat servlets filesystems derby


【解决方案1】:

您需要使文件系统持久性位置成为程序的显式参数,可能作为属性(即-DdataStoreLocation=somepath)。一般而言,Java 应用程序可能有权访问文件系统,也可能无法访问文件系统——它可能在 WAR 中运行,甚至可能从网络加载,并且没有与类路径相关的文件系统。

将其作为一个明确的要求并成为您应用与用户的合同的一部分是保证有一个文件系统可供使用的唯一方法,也是一种获取要使用的路径名的方法。

【讨论】:

  • 好的,所以你的答案是“否”:不存在 Servlet 可以写入的通用文件系统位置。所以我应该坚持使用数据源(如您所建议的那样,在部署时报告位置/配置选择),或者,为了仍然能够使用嵌入式数据库,将其文件系统位置作为参数传递(我可以使用 @987654322 执行此操作吗? @?JNDI?)。
  • 可能没有文件系统,但不太可能。 Context 只是 Java 应用程序可以与其环境交互的另一种方式,如果该环境是应用服务器的话。有一个系统属性java.io.tmpdir 用于临时文件系统资源,但不能保证放置在那里的东西会无限期地存在。由于您专门询问 servlet,因此 Context 是提供路径信息的好地方。
【解决方案2】:

当您安装应用程序时,您希望看到您的数据存储在/usr/bin(或C:/Program Files)的某个位置还是其他数据所在的主目录中?

不要将您的应用程序二进制文件(永远不会改变)与它所操作的数据结合起来。您不想在删除应用程序时丢失数据,反之亦然。用户主目录甚至更好——安装过程中选择的文件夹——要好得多。

【讨论】:

  • 如何在服务器部署的应用程序的上下文中定义“用户主目录”?我理解不写入 WebContent 的动机确实是由于重新部署而导致删除的风险。
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 2018-01-11
  • 2011-12-14
  • 2018-09-04
  • 1970-01-01
  • 2014-02-25
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多