我应该在Tomcat Web应用程序中将持久性文件存储在哪里?
答案 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.home
或user.dir
然后 - 或者您可以在命令行上传递的任何其他系统属性。我不喜欢它,我不会这样做,这并不能解决前面提到的问题,但毕竟这是你的选择。)
答案 2 :(得分:4)
将文件存储在运行Tomcat的用户的主目录下的webapp目录中是一个很好的方便选项。它位于Tomcat之外,这意味着它将在重新部署后继续存在,并且它通常是一个可写目录(因为它是在用户的主目录下创建的)。 但是允许通过系统属性覆盖此类目录的位置始终是个好主意。
答案 3 :(得分:1)
通常,这将转到数据库。但由于OP坚持不使用数据库,我会尝试不同的方法:
${user.home}/.myapp
。应用程序有时会将此用于例搜索索引,可以根据数据库中的数据重新计算。您的用例可以使用用户的主页。答案 4 :(得分:0)
我通常建议使用数据库来存储持久数据并通过DataSource公开它。
如果您不想这样做,我猜您可以考虑使用“user.home”系统属性(我已经看到过在某些情况下使用过这种情况)。但是......除非您自己配置,否则无法保证您的servlet将具有写访问权限。