2009-11-24 67 views
11

我应该在哪里将持久性文件存储在Tomcat Web应用程序中?何处/如何使用tomcat存储持久数据?

  • javax.servlet.context.tempdir是不可行的,当应用程序重新部署它的擦除/删除
  • 不想使用例如绝对路径servlet初始化参数
  • 在数据库中存储的文件是不是一种选择
+2

我认为你不想使用数据库? – Suppressingfire 2009-11-24 20:15:43

+2

你必须解释为什么数据库不是一种选择,它们是如此基本和普遍,以至于不允许它意味着其他事情正在发生。也许你是在一个我们应该知道的特殊约束环境中。 – Karl 2009-11-24 20:46:59

+2

这不是一种选择,因为它不是。我可以继续讲解如何通过对数据库一无所知的传统外部工具来处理这些大型文件,并将它们显示在数据库中,目的只是为了将它们再次拉出来,目前没有任何用处。还有更多,但只要我的话:-) - – nos 2009-11-24 23:06:38

回答

9

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

我们的系统管理员在我们的服务器上建立了一个tomcat用户拥有rw权限的目录(例如/var/tomcat/persist)。我们已经建立了一个目录结构,tomcat使用它来存储文件,读取特定于应用程序的init文件等。

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

5

回答问题的标题,有关使用一个数据库,一个DataSource和JDNI什么?即使在仅限Web的环境中,由于并发性,线程,安全性,集群,可移植性等问题,也不推荐使用java.io写入文件。其中一些问题可能是“解决方法”,但仍然不是最佳做法。标准的方法是使用数据库,我建议重新考虑这个选项,将“基于文件”的轻量级数据库(如HSQLBD或JavaDB)引入混合。

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

+0

克莱德。数据库不是一个选项。 – nos 2009-11-24 20:28:20

0

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

如果你不想这样做,我想你可以考虑使用“user.home”系统属性(我已经看到这在少数情况下使用)。但是......没有保证你的servlet将被授权运行,除非你自己配置。

4

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

1

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

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

在tomcat7上(至少在Ubuntu上)写入$ {user.home}会因为权限而导致IOException。 – Jonathan 2016-12-22 19:21:58

相关问题