在哪里/如何使用tomcat存储持久数据?

我应该在Tomcat Web应用程序中将持久性文件存储在何处?

  • javax.servlet.context.tempdir不可行,重新部署/删除应用时会被删除
  • 不希望在例如servlet init参数中使用绝对路径
  • 将文件存储在数据库中不是一种选择

我们的团队做了很多。 我们遵循的一般规则是在Web应用程序之外和Tomcat之外。

我们的sysadmin在我们的服务器上设置了一个tomcat用户具有rw权限的目录(例如/var/tomcat/persist )。 我们在其下构建了一个目录结构,tomcat用它来存储文件,读取特定于应用程序的init文件等。

如果您不想在init-params中为servlet使用绝对路径,请考虑在启动tomcat时设置系统属性。 好消息是在tomcat下运行的每个应用程序都可以访问它。 糟糕的是,在tomcat下运行的每个应用程序都可以访问它。 您可以设置名为base.persist.dir的属性,并为其下的每个应用程序构建子目录。 我们在CATALINA_OPTS环境变量下的bin /目录中的setenv.sh脚本中设置系统属性。

回答问题的标题,使用数据库, DataSource和JDNI怎么样? 即使在仅限Web的上下文中,由于并发,线程,安全性,群集,可移植性问题,也不建议使用java.io写入文件。 其中一些问题可能是“变通的”,但仍然不是最佳实践。 标准方法是使用数据库,我建议重新考虑这个选项,将“基于文件”的轻量级数据库(如HSQLBD或JavaDB)投入到混合中。

(编辑:由于一个未知的原因,数据库不是一个选项。使用JNDI或上下文参数或init参数传递绝对路径 – 这是更糟糕的选项恕我直言 – 也被排除。对于相对路径,也许看看user.homeuser.dir然后 – 或者你可以在命令行上传递的任何其他系统属性。我不喜欢它,我不会这样做,这不能解决前面提到的问题,但它是你的选择毕竟。)

将文件存储在运行Tomcat的用户的主目录下的webapp目录中是一个很好的方便选项。 它位于Tomcat之外,这意味着它将在重新部署中存活,并且它通常是一个可写目录(因为它是在用户的主目录下创建的)。 但是允许通过系统属性覆盖此类目录的位置始终是个好主意。

通常,这将转到数据库。 但由于OP坚持不使用数据库,我会尝试不同的方法:

  • 已知的文件系统路径: ${user.home}/.myapp 。 应用程序有时将其用于例如可以基于数据库中的数据重新计算的搜索索引。 您的用例可以使用用户的家
  • 将可配置文件系统路径存储在配置库中,例如数据库或Java Preferences (如果您不喜欢使用servlet init params)。 诸如Atlassian JIRA之类的商业应用程序使用可配置(但绝对)的文件系统路径来存储问题附件。 如果他们不知道更好的方式,我不知道谁做:)

我通常建议使用数据库来存储持久数据并通过DataSource公开它。

如果你不想这样做,我想你可以考虑使用“user.home”系统属性(我已经看到过在一些情况下使用过)。 但是……除非您自己配置,否则无法保证您的servlet将以具有写访问权限的方式运行。