2010-02-17 8 views
19

Sé que para JBoss necesita un archivo [nombre] -ds.xml en el subdirectorio/deploy de la instancia correspondiente. no tengo ninguna experiencia con otros contenedores Java EE, pero estoy tratando de cumplir con los estándares tanto como sea posible. ¿existe una forma estándar de definir un origen de datos JDBC y desplegarlo? si es posible, me gustaría incluir mi fuente de datos dentro del archivo * .ear (por ejemplo, un datasource HSQLDB en memoria incorporado para fines de demostración).¿existe una forma estándar de definir un JDBC Datasource para contenedores Java EE?

si no hay una forma estándar, ¿otros contenedores aceptarán al menos el modo jboss? (/deploy/*-ds.xml)

Respuesta

21

¿Existe una manera estándar de definir un origen de datos JDBC y desplegarlo?

Sí, la hay. Se realiza a través del elemento <data-source>, que puede colocar en web.xml, ejb-jar.xml y application.xml. Si no te gusta XML, también se puede utilizar una anotación para este lugar: @DataSourceDefinition

ejemplo de una entrada Web.xml

<data-source> 
    <name>java:app/myDS</name> 
    <class-name>org.postgresql.xa.PGXADataSource</class-name> 
    <server-name>pg.myserver.com</server-name> 
    <database-name>my_db</database-name> 
    <user>foo</user> 
    <password>bla</password> 
    <transactional>true</transactional> 
    <isolation-level>TRANSACTION_READ_COMMITTED</isolation-level> 
    <initial-pool-size>2</initial-pool-size> 
    <max-pool-size>10</max-pool-size> 
    <min-pool-size>5</min-pool-size> 
    <max-statements>0</max-statements> 
</data-source> 

Más información:

p.s. Estoy sorprendido de que todas las otras respuestas digan que esto no existe, mientras que claramente sí, incluso en el momento en que se formuló originalmente esta pregunta.

+0

La pregunta fue sobre la configuración específica del contenedor, creo? Al igual que http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html Este no es el equivalente de que si entiendo la pregunta correctamente. Pero sí, tienes razón, esta es la respuesta correcta para el 90% de los casos: tenía unos meses de antigüedad en el momento en que se hizo y ¡seguro que no lo sabía! –

+1

@SeanOwen> 'La pregunta era acerca de la configuración específica del contenedor, creo" Creo que Op solicitó una forma estándar para algo que de otro modo se podría hacer a través de la configuración específica del contenedor. Estoy de acuerdo en que en ese momento este mecanismo tenía solo unos pocos meses, y los diferentes proveedores no hicieron mucho ruido al respecto. –

+0

yup, OP definitivamente estaba buscando algo como esto :-) muchas gracias Arjan. significa que necesito ir con la implementación explosionada para hacer que la configuración sea fácilmente accesible para los scripts/herramientas, pero es una opción muy válida. si miras la fecha, estaba viendo ~ 2010, así que j2ee6 no era realmente una opción. – radai

0

La filosofía Sun EE Java EE define varios roles en el diseño, desarrollo e implementación de una aplicación empresarial. El diseño de Java EE acomoda y refleja estas separaciones de preocupaciones.

En particular, Sun desea separar al desarrollador del administrador de una aplicación, lo cual es una buena idea. El desarrollador escribe componentes empresariales de una manera independiente del contenedor. En web.xml, por ejemplo, usted declara sus DataSources de una manera estándar:

<resource-ref> 
<res-ref-name>jdbc/myDB</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
</resource-ref> 

Esto dice "esta cosa base de datos de las necesidades de la aplicación, hacer que esté disponible para mí, cualquiera que sea la base de datos es y lo que eres contenedor ejecutándolo, a través de JNDI estándar en 'jdbc/myDB' ". Esto es todo lo que el desarrollador puede hacer: el resto es necesariamente específico del contenedor y, por lo tanto, no está estandarizado.

Y entonces, ¿cómo se configura realmente "myDB" tiene un rol diferente, el administrador del contenedor.

Así que estoy repitiendo la respuesta correcta anterior: no. Pero la razón es que, de lo contrario, estaría codificando su aplicación a un tipo específico de base de datos en un host y puerto específico, y el punto es que no debería poder hacer eso, por lo que no hay soporte estándar para eso en propósito.

+0

mientras esté correcto para el caso general, en mi caso Pienso en el uso de una base de datos en-JVM, en memoria, la hibernación en la parte superior (pensar en ella como una caché de objetos) - algo que estaba esperando pudo hacerse de manera portátil – radai

+1

> que es una buena idea, es una buena idea para algunos casos de uso, pero no para todos los casos de uso. Java EE 6 comenzó a proporcionar alternativas (por ejemplo, puede definir una fuente de datos desde su aplicación), y Java EE 7 ha seguido esta tendencia (cosas como los destinos JMS y las sesiones de correo también se pueden definir desde la aplicación). –

+1

> no debería poder hacer eso: las especificaciones no deberían imponer una única y única forma de trabajo. Esta explicación no tiene en cuenta por completo la existencia de bases de datos locales, privadas (posiblemente en memoria) Y no se reduce a la más simple de las aplicaciones. Las interfaces y los módulos separados para la lógica de negocios podrían haber sido una mejor práctica para algunos casos de uso, pero hacerla cumplir hizo que EJB se sintiera pesada. Desde Java EE 6 en adelante, la elección depende del desarrollador (ahora las interfaces y un módulo EJB independiente son opcionales). –

5

¿Existe una manera estándar de definir un origen de datos JDBC y desplegarlo?

No, esto es específico del contenedor. Como Application Component Provider, se supone que debe documentar los recursos que necesita y el Application deployer and Administrator los configurará.

Si no hay una forma estándar, ¿otros contenedores aceptarán al menos la forma de JBoss?

No, porque esta es la forma de JBoss y, por lo tanto, específica de JBoss.

  • Con Tomcat, tendría que usar el archivo context.xml.
  • Con embarcadero, jetty-env.xml.
  • Con WebSphere, puede crear un llamado WebSphere Enhanced EAR.
  • Con WebLogic, puede empaquetar un JDBC Module en su aplicación.
  • Con GlassFish, puede usar el comando asadmin add-resources my.xml para agregar un origen de datos descrito en un archivo XML (ejemplo here).
  • Etc, etc.

Tenga en cuenta que hay algunos proyectos que tratan de lograr este objetivo de una manera universal, como jndi-resources o Cargo. También hay una solución más compleja como ControlTier o Chef.

Ahora, en su caso (como entendí que desea utilizar una base de datos incrustada que se incluirá con su aplicación), no creo que deba configurar un origen de datos a nivel del servidor de aplicaciones. Simplemente debe empaquetar el archivo jar de su base de datos en su aplicación con un grupo de conexiones independiente como c3p0 o DBCP.

+1

> esto es específico del contenedor. - No, no es necesariamente contenedor específico. También hay una forma estándar de usar el elemento '' en, p. web.xml (ver mi respuesta a continuación). –

Cuestiones relacionadas