繁体   English   中英

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

[英]Where/how to store persistent data with tomcat?

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

  • javax.servlet.context.tempdir不可行,重新部署/删除应用程序后将其删除
  • 不想在servlet初始化参数中使用绝对路径
  • 不能将文件存储在数据库中

我们的团队经常这样做。 我们遵循的一般规则是在Web应用程序外部和Tomcat外部。

我们的系统管理员在服务器上设置了tomcat用户具有rw权限的目录(例如/var/tomcat/persist )。 我们在此基础上构建了一个目录结构,tomcat使用该目录结构来存储文件,读取特定于应用程序的初始化文件等。

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

回答问题的标题,如何使用数据库, DataSource和JDNI? 即使在纯Web上下文中,由于并发,线程,安全性,集群,可移植性问题,实际上也不建议使用java.io写入文件。 其中一些问题可以“解决”,但实际上,这并不是最佳实践。 标准方法是使用数据库,我建议重新考虑此选项,将诸如HSQLBD或JavaDB之类的“基于文件的”轻量级数据库放入组合中。

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

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

通常,这将转到数据库。 但是由于OP坚持不使用数据库,因此我尝试使用另一种方法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM