2010-07-01 14 views
18

Mi aplicación web Java (myapp.war) se implementa colocándola en el directorio webapps de Tomcat en Ubuntu 10.04.¿Dónde debería una aplicación web Java almacenar sus datos?

Esta aplicación necesita guardar algunos datos en los archivos. Pero el usuario que ejecuta Tomcat (tomcat6) no tiene acceso de escritura al directorio de inicio /usr/share/tomcat6/ y no tiene acceso de escritura al directorio de trabajo actual /var/lib/tomcat6/, ya que ambos pertenecen a root.

Entonces, ¿dónde debería una aplicación web almacenar sus datos? Espero que no sea el archivo extraído en el directorio de webapps. Este podría eliminarse muy fácilmente por accidente. Y Tomcat se puede configurar, no para extraer archivos .war. Entonces no habría ningún director extraído.

Quizás /var/lib/tomcat6/ debe pertenecer al usuario tomcat6 ant y este es un error en Ubuntu?

+0

No hay garantía de que un contenedor web le permita usar el sistema de archivos ... –

+0

¿Está tratando de leer datos o escribirlos? Normalmente, las aplicaciones web no utilizan el sistema de archivos para guardar datos, sino que utilizan una base de datos, un servicio web o una cola JMS para comunicarse con otro sistema de forma síncrona o asíncrona, respectivamente. –

+0

Necesito leer y escribir datos. Tengo mi propio marco de almacenamiento, que funciona mucho mejor que cualquier base de datos para mí. – Witek

Respuesta

2

Encontré la solución en Launchpad. /var/lib/tomcat6/webapps/ es escribible. Esto significa, que los siguientes trabajos:

File myFile = new File("webapps/myfile.txt"); 
+1

Bien, pero probablemente no sea una solución portátil (funciona con Tomcat, pero podría no funcionar si ejecuta su aplicación web en otro servidor de aplicaciones Java EE). – Jesper

+0

Y no funcionará si cambia el directorio de trabajo (la carpeta desde donde se emitió el comando para iniciar Tomcat). Usar rutas relativas en Java IO es una idea terrible. Más bien use rutas absolutas en Java IO como '/ var/lib/tomcat6/webapps/myfile.txt'. – BalusC

+0

Las rutas absolutas me vincularían a Tomcat en Linux. Me gustaría ofrecer un archivo .war que solo se debe colocar en el directorio de webapps en casi todas las plataformas posibles. – Witek

0

No he visto ninguna orientación específica sobre dónde debe almacenar ese tipo de datos localmente, probablemente porque normalmente almacenará ese tipo de datos en una base de datos.

Cuando necesito almacenar datos tan rápidos y sucios como estos, los almaceno en un sistema de archivos específicamente para esos datos, para aislarlo de otras áreas donde podría quedar atrapado en otra actividad. No he tenido ningún problema con el enfoque hasta el momento. Además, si es importante, asegúrese de guardarlo en algún lugar donde lo esté respaldando :)

+1

Incluso si almacenara datos en una base de datos, tendría que almacenar datos de acceso para la base de datos en alguna parte. – Witek

+0

¿Qué quiere decir con "access-data"? – Dolph

+2

@Witek, Tomcat puede proporcionar JDBC DataSources preconfigurado a través de JNDI. La configuración para esos va en los archivos de configuración de Tomcat usuales. –

2

Creo que depende del tipo de datos que está tratando. La mayoría de las veces, los datos entran en la base de datos simplemente porque es rápido y fácil de realizar un CRUD. Si desea almacenar la configuración de usuario localizada y no le importa qué tan portátil es, tal vez puede almacenar en user.home, lo hice para uno de mis proyectos y eso funciona bien. Dicho todo esto, realmente no creo que haya una mejor práctica en esto y la base de datos parece ser la opción más obvia porque puedes hacer muchas tareas diferentes en contra de ella, y la mayoría de ellas son gratuitas para empezar. :)

+0

user.home no funciona. En Ubuntu, pertenece a la raíz. – Witek

4

Si los archivos no tienen por qué persisten más largo que el ciclo de vida del contexto servlet, el contenedor de servlets proporciona un directorio temporal privado para cada contexto servlet, especificado por javax.servlet.context.tempdir atributo.

Ver Servlet Specification 2.3, Capítulo 3 servlet Contexto

3.7.1 Temporal de Trabajo Directorios

La conveniencia de un directorio almacenamiento temporal que se requiere para cada contexto servlet. Los contenedores de servlets deben proporcionar un directorio privado temporal por contexto de servlet y ponerlo a disposición mediante el atributo javax.servlet.context.tempdircontext . El objeto asociado a el atributo debe ser de tipo java.io.File

2

Respondiendo a su propia pregunta, Witek declaró /var/lib/tomcat6/webapps/ is writable - al menos en su instalación de la versión de Ubuntu. En mi RHEL 5.2 sistema /var/lib/tomcat<X> ni siquiera existe, por lo que no hay ningún subdirectorio de webapps escribible o no, lo que conduce a mi respuesta.

Q: ¿Dónde debería una aplicación web Java almacenar sus datos?
A: Donde lo haya configurado para almacenar sus datos.

Establezca la ubicación configurable, en web.xml como <context-param> o en un archivo myApplication.properties.

  • Puedo ponerlo donde quiero en mi caja, los SysAdmins pueden ponerlo donde quieran en el sistema de producción.
  • Puede cambiar de opinión más adelante.
  • que no es necesario enlaces simbólicos (que tienen mágicamente desaparecieron en mí antes, rompiendo el sistema.)
  • Puede tener varios conjuntos de datos de prueba, y acaba de señalar la configuración en lo que uno desea.
  • Puede colocarlo donde haya espacio en disco.
  • Usted es va a cambiar de opinión más adelante.
+2

La configuración en web.xml causaría grandes problemas durante la actualización. Cada nuevo .war entregado por los desarrolladores sobrescribiría la configuración de los administradores. – Witek

+1

Leer un archivo personalizado myApplication.properties plantea el problema, debemos buscar el archivo. – Witek

Cuestiones relacionadas