Pregunta Configuración del origen de datos de Spring para localhost, desarrollo y producción


Estoy intentando descubrir cómo mi aplicación Spring puede determinar dónde se implementa y cargar el origen de datos apropiado. Tenemos 3 entornos ... mi local, el servidor de desarrollo y el servidor de producción. Hasta ahora tengo 3 archivos de propiedades llamados

localhost.datasource.properties
development.datasource.properties
production.datasource.properties

Los tengo conifgured así:

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/resources/properties/production.datasource.properties</value>
                <value>classpath:/resources/properties/development.datasource.properties</value>
                <value>classpath:/resources/properties/localhost.datasource.properties</value>
            </list>
        </property>
    </bean>

    <bean id="dataSourceMySQL" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${mysql.jdbc.driver.class.name}"
        p:url="${mysql.jdbc.url}"
        p:username="${mysql.jdbc.username}"
        p:password="${mysql.jdbc.password}" />

</beans>

Esto funciona bien cuando estoy en mi máquina localhost. Si despliego un archivo war al desarrollo, todavía está leyendo las propiedades de localhost ya que es el último en la lista y aparece un error. ¿Cuál es la mejor manera de implementar esto?

Gracias


12
2017-08-25 19:47


origen


Respuestas:


Para las fuentes de datos, la manera más fácil sería definir las fuentes de datos y dejar que el contenedor administre la agrupación de conexiones.

Para hacerlo, defina una referencia de recurso a la fuente de datos en web.xml

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/MyDataSource</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

y haz referencia en primavera como tal:

<jee:jndi-lookup 
     id="dataSource" 
     jndi-name="jdbc/MyDataSource" />

luego puede definir la fuente de datos en el servidor de aplicaciones, lo que significa que puede cambiar la base de datos subyacente. En el caso de websphere, esto se haría a través de la consola websphere. En el caso de tomcat, se realizaría a través de Context.xml:

<Context>
    ...
  <Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource"
            maxActive="100" maxIdle="30" maxWait="10000"
            username="javauser" password="javadude"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/javatest"/>
</Context>

De esta forma, solo necesita cambiar el contexto para implementar en el desarrollo, la prueba y la producción y no vincular su aplicación a una base de datos específica.


15
2017-08-25 20:14



Pase una propiedad del sistema al marcador de posición de propiedad, pero incluya los tres archivos en el WAR:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
           <value>classpath:/resources/properties/${myenv}.datasource.properties</value>
        </list>
    </property>
</bean>

4
2017-08-25 22:37



Echa un vistazo aquí: http://blog.jayway.com/2010/10/21/environment-specific-configuration-of-spring-applications/ Puede tener una configuración predeterminada en su aplicación, y opcionalmente anularla con un archivo en un lugar predefinido en su sistema de archivos.


2
2017-08-25 20:05



Dos soluciones

  • Tener un valor en lugar de tres con un nombre genérico y en su configuración de compilación proporcionar un indicador de qué archivo de propiedades se debe copiar a esa ruta / nombre de archivo.

  • Proporcione las propiedades como argumento de VM al iniciar el servidor como -Ddatasource.properties = c: \ config \ development.datasource.properties y en su archivo de configuración XML <value> file: /// $ {datasource.properties} </ value>


2
2017-08-25 20:02



Las otras respuestas aquí tienen buenas ideas en ellas, pero estoy respondiendo porque mi propio enfoque es una combinación de las tres. Primero, no haga referencia a los archivos de propiedades de múltiples entornos directamente en su Spring XML. Solo trabaje desde un solo archivo. Luego, usando una combinación de Spring's <context:property-placeholder>, <jee:jndi-lookup>, <util:properties>y SpEL, puede configurar fácilmente una configuración muy flexible.

  1. los <context:property-placeholder> se conecta con la salida de la <util:properties>.
  2. los <util:properties> usa SpEL para verificar una propiedad del sistema con un nombre de pila. Si está disponible, usa eso como la ubicación de un archivo de propiedades para cargar. Si no,
  3. Vuelve a la <jee:jndi-lookup>, que intenta hacer una búsqueda JDNI para la ubicación. Si eso tampoco encuentra nada, entonces
  4. Predeterminado a una ubicación de ruta de clases codificada por el default-value atributo de <jee:jndi-lookup>.

Esta configuración simplifica la especificación de la ubicación de un archivo de propiedades sin importar el entorno en el que se encuentre debido a todas las opciones.


2
2017-08-25 21:37



Consideraría usar Cocoon Spring Configurator, que se puede usar de forma independiente, sin el resto del proyecto Cocoon:

http://cocoon.apache.org/subprojects/configuration/spring-configurator/index.html

Esta publicación del blog me pareció realmente útil para comenzar:

http://mrhaki.blogspot.com/2009/02/use-spring-configurator-to-support.html


0
2018-03-21 19:51