forma adecuada para realizar datasources / recursos de un entorno en tiempo de despliegue

StackOverflow https://stackoverflow.com/questions/2343976

Pregunta

Tengo una aplicación web que requiere dos parámetros:

  • A JDBC origen de datos
  • Una cadena símbolo

quiero desesperadamente ser capaz de desplegar un .war a varios contenedores diferentes (el embarcadero, Tomcat, mínimos GF3) y establezca estas configuraciones a nivel de aplicación dentro del contenedor.

Mi código hace lo siguiente:

InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")

Vamos a suponer que he utilizado la interfaz de gestión GlassFish para crear dos recursos JDBC: jdbc / test-fuente de datos JDBC y / live-fuente de datos que se conectan a diferentes copias del mismo esquema, en diferentes servidores, etc. credenciales diferentes Say I quieren implementar esta a glassfish con y apunte hacia la fuente de datos de prueba, que podría tener esto en mi sun-web.xml:

...
<resource-ref>
  <res-ref-name>jdbc/datasource</res-ref-name>
  <jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...

y

  • sun-web.xml va dentro de mi guerra, ¿verdad?
  • Seguramente debe haber una manera de hacer esto a través de la interfaz de gestión

Am I incluso tratando de hacer lo correcto? Hacen otros recipientes hacen que este sea más fácil? Yo estaría interesado en particular en la forma embarcadero 7 mangos esto desde que lo utilizan para el desarrollo.

Editar Tomcat tiene una forma razonable de hacer esto:

Crea $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml con:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
  <!-- String resource -->
  <Environment name="token" value="value of token" type="java.lang.String" override="false" />

  <!-- Linking to a global resource -->
  <ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />

  <!-- Derby -->
  <Resource name="jdbc/datasource2"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
    url="jdbc:derby:test;create=true"
    />

  <!-- H2 -->
  <Resource name="jdbc/datasource3"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.h2.jdbcx.JdbcDataSource"
    url="jdbc:h2:~/test"
    username="sa"
    password=""
    />
</Context>

Tenga en cuenta que override="false" significa lo contrario. Esto significa que este ajuste no puede ser sobreescrito por web.xml.

Me gusta este enfoque debido a que el archivo es parte de la contenedor configuración no la guerra, pero no es parte de la configuración global; es de aplicación web específica.

supongo que esperaba un poco más de glassfish ya que se supone que tiene una interfaz de administración web completa, pero sería bastante feliz con algo equivalente a la anterior.

No hay solución correcta

Otros consejos

Para v3 GF, es posible que desee para tratar de aprovechar la opción --deploymentplan del subcomando despliegue de asadmin. Se discute en la página hombre Implementar el subcomando .

Nos acababa de este problema al migrar de Tomcat para Glassfish 3. Aquí es lo que funciona para nosotros.

  • En la consola de administración Glassfish, fuentes de datos configure (piscinas y recursos de conexión JDBC) para DEV / PRUEBA / PROD / etc.
  • Anote sus parámetros de despliegue de tiempo (en nuestra base de datos información de conexión caso) en el archivo de propiedades. Por ejemplo:
# Database connection properties
dev=jdbc/dbdev
test=jdbc/dbtest
prod=jdbc/dbprod
  • Cada aplicación web puede cargar el mismo archivo de propiedades de base de datos.
  • búsqueda del recurso JDBC de la siguiente manera.

import java.sql.Connection;
import javax.sql.DataSource;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * @param resourceName the resource name of the connection pool (eg jdbc/dbdev)
 * @return Connection a pooled connection from the data source 
 * associated with resourceName
 * @throws NamingException will be thrown if resource name is not found
 */
 public Connection getDatabaseConnection(String resourceName) 
             throws NamingException, SQLException {
    Context initContext = new InitialContext();
    DataSource pooledDataSource = (DataSource) initContext.lookup(resourceName);
    return pooledDataSource.getConnection();
 }

Tenga en cuenta que esto es no el habitual proceso de dos etapas que implica una mirada hacia arriba usando el contexto de nomenclatura "java: comp / env." No tengo idea de si esto funciona en contenedores de aplicaciones que no sean GF3, pero en GF3 no hay necesidad de añadir descriptores de recursos a web.xml cuando se utiliza el enfoque anterior.

No estoy seguro de entender realmente la pregunta / problema.

Como Proveedor de componente de aplicación , se declara el recurso (s) requerido por su aplicación en una forma estándar (agnóstico contenedor) en el web.xml.

En el tiempo de implementación, el Aplicación implementador y Administrador se supone que siga las instrucciones proporcionadas por el Proveedor de componente de aplicación para resolver las dependencias externas (entre otras cosas), por ejemplo mediante la creación de una fuente de datos a nivel de servidor de aplicaciones y mapear su verdadero nombre JNDI para el nombre del recurso utilizado por la aplicación a través del uso de un descriptor de despliegue específico del servidor de aplicaciones (por ejemplo, la sun-web.xml para GlassFish). Obviamente, esto es un contenedor específico paso y por lo tanto no cubierta por la especificación Java EE.

Ahora, si desea cambiar la base de datos de una aplicación está utilizando, usted tendrá que o bien:

  • cambiar la asignación en el descriptor de despliegue del servidor de aplicaciones - o -
  • modificar la configuración de la fuente de datos existente para hacer que apunta en otra base de datos.

Tener una interfaz de administración en realidad no cambia nada. Si me he perdido algo, no dude en hacérmelo saber. Y por si acaso, tal vez echar un vistazo a esta respuesta anterior .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top