Tomcat servlet写入的可接受位置?

Tomcat servlet写入的可接受位置?,tomcat,servlets,filesystems,derby,Tomcat,Servlets,Filesystems,Derby,我想在Tomcat上运行的基于servlet的应用程序中嵌入Derby数据库 为此,我需要将数据库文件持久保存在磁盘上。我更希望它们驻留在已部署web应用程序的子文件夹中(然后可以使用getServletContext().getRealPath())进行转换) 是否有一个良好的实践wrt可接受的、servlet可以安全写入的应用程序相对位置?如果没有这样的建议,tomcat特有的良好实践是什么 似乎排除了在WebContent中写作的可能性;我是否必须像一些教程所指出的那样,将数据写入CATA

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

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

是否有一个良好的实践wrt可接受的、servlet可以安全写入的应用程序相对位置?如果没有这样的建议,tomcat特有的良好实践是什么


似乎排除了在
WebContent
中写作的可能性;我是否必须像一些教程所指出的那样,将数据写入CATALINA_HOME的子文件夹(但感觉有点骇人)?

当您安装应用程序时,您是否希望看到数据存储在
/usr/bin
(或
C:/Program Files
)中,或者更希望看到数据存储在您的主目录中


不要将应用程序二进制文件(永远不会更改)与其操作的数据耦合在一起。您不希望在删除应用程序时丢失数据,反之亦然。用户主目录或更好的文件夹(安装期间选择的文件夹)要好得多。

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


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

在服务器部署的应用程序的上下文中,您如何定义“用户主目录”?我知道不写入WebContent确实是因为重新部署导致删除的风险。好的,所以您的答案是“否”:不存在Servlet可以写入的通用文件系统位置。因此,我应该坚持使用数据源(正如您所建议的,它在部署时报告位置/配置选择),或者,为了仍然能够使用嵌入式数据库,将其文件系统位置作为参数传递(我可以使用
server.xml
?JNDI吗?),可能没有文件系统,但可能性不大。上下文只是Java应用程序与其环境交互的另一种方式,如果该环境是应用程序服务器的话。有一个用于临时文件系统资源的系统属性
java.io.tmpdir
,但不能保证放在那里的东西会无限期地持久。由于您专门询问servlet,因此上下文是提供路径信息的最佳场所。至于
getRealPath()
问题,这是不好的,因为无论何时重新部署WAR,甚至重新启动自动重新部署现有WAR的服务器,您在那里所做的任何更改都将丢失。原因很简单,这些变化根本不包含在最初的战争中。