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

时间:2009-11-24 20:13:35

标签: java tomcat

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

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

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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