2009-11-24 18 views
11

¿Dónde debo almacenar archivos persistentes en una aplicación web Tomcat?¿Dónde/cómo almacenar datos persistentes con tomcat?

  • javax.servlet.context.tempdir no es factible, se borrará cuando se redistribuyen los app/retira
  • no desea utilizar una ruta absoluta en, por ejemplo init servlet parámetros
  • Almacenamiento de los archivos en una base de datos no es una opción
+2

Supongo que no desea utilizar una base de datos? – Suppressingfire

+2

Tendrás que explicar por qué una base de datos no es una opción, son tan básicos y comunes que no permitir su uso significa que algo más está sucediendo. Tal vez estés en un ambiente especialmente restringido del que deberíamos saber. – Karl

+2

No es una opción porque no lo es. Podría seguir explicando cómo estos archivos de gran tamaño deben ser procesados ​​por herramientas externas heredadas que no saben nada de las bases de datos, y mostrarlas en una base de datos simplemente por sacarlas de nuevo sirve en este momento para nada. También hay más, pero solo tome mi palabra :-) - – nos

Respuesta

9

Nuestro equipo hace esto mucho. Una regla general que seguimos es fuera de la aplicación web y fuera de Tomcat.

Nuestro sysadmin configuró un directorio en nuestro servidor que el usuario de tomcat tiene permisos rw (por ejemplo, /var/tomcat/persist). Hemos construido una estructura de directorios bajo esto que tomcat usa para almacenar archivos, leer archivos de inicio específicos de la aplicación, etc.

Si no quiere usar una ruta absoluta en su init-params para su servlet, considere establecer una propiedad del sistema cuando tomcat se inicia. Lo bueno de esto es que todas las aplicaciones que se ejecutan en tomcat tendrán acceso a ellas. Lo malo de esto es que cada aplicación que se ejecuta bajo Tomcat tendrá acceso a ella. Puede establecer una propiedad llamada base.persist.dir y crear subdirectorios para cada aplicación debajo de ella. Establecemos las propiedades del sistema en el script setenv.sh en el directorio bin/ en la variable de entorno CATALINA_OPTS.

5

Contestar el título de la pregunta, ¿qué pasa con el uso de una base de datos, un DataSource y JDNI? Incluso en un contexto web único, escribir en archivos usando java.io no es realmente recomendable debido a problemas de concurrencia, subprocesos, seguridad, clustering y portabilidad. Algunos de estos problemas pueden ser "provisionales" pero aún así, esta no es realmente una mejor práctica. El enfoque estándar es usar una base de datos y sugiero reconsiderar esta opción, lanzando una base de datos liviana "basada en archivos" como HSQLBD o JavaDB a la mezcla.

(EDIT: Por una razón desconocida, base de datos no es una opción El uso de parámetros JNDI o contexto o parámetros de inicio a pasar una absoluta ruta - que son las opciones menos peor en mi humilde opinión - se excluye demasiado Para una relativa.. ruta, tal vez mire user.home o user.dir - o cualquier otra propiedad del sistema que pueda pasar en la línea de comandos. No me gusta, no lo haría, y esto no resuelve los problemas mencionados anteriormente, pero es su elección después de todo.)

+0

Claridfied. La base de datos no es una opción. – nos

0

En general, le sugiero que use una base de datos para almacenar datos persistentes y exponerlos a través de un DataSource.

Si no quiere hacer eso, supongo que podría considerar usar la propiedad del sistema "user.home" (he visto esto usado en algunas circunstancias). Pero ... no hay garantías de que su servlet se ejecute con permiso para escribir el acceso a menos que usted mismo lo configure.

4

Almacenar los archivos en un directorio de aplicaciones web bajo el directorio principal del usuario que ejecuta Tomcat es una buena y conveniente opción. Está fuera de Tomcat, lo que significa que sobrevivirá al redespliegue, y generalmente es un directorio que se puede escribir (porque se creó bajo el directorio de inicio de los usuarios). Pero siempre es una buena idea permitir anular la ubicación de dicho directorio a través de la propiedad del sistema.

1

En general, esto iría a la base de datos.Pero desde el OP insiste en no usar una base de datos, me gustaría probar un enfoque diferente:

  • ruta del sistema de archivos que se conoce: ${user.home}/.myapp. Las aplicaciones a veces usan esto para, p. índices de búsqueda que pueden ser recalculados en base a los datos en la base de datos. Podría estar bien para su caso de uso para usar el hogar del usuario.
  • Almacene la ruta del sistema de archivos configurable en un repositorio de configuración como la base de datos o quizás Preferencias de Java (si no desea utilizar los parámetros de inicialización de servlet). Las aplicaciones comerciales como Atlassian JIRA utilizan una ruta de sistema de archivos configurable (pero absoluta) donde almacenan archivos adjuntos de problemas. Si ellos no conocen una mejor manera, no sé quién lo hace :)
+0

Escribir en $ {user.home} en tomcat7 (al menos en Ubuntu) dará como resultado una IOException debido a los permisos. – Jonathan

Cuestiones relacionadas