Конфигурация источника данных Spring для localhost, разработки и производства - PullRequest
12 голосов
/ 25 августа 2011

Я пытаюсь выяснить, как мое приложение Spring может определить, где оно развернуто, и загрузить соответствующий источник данных. У нас есть 3 среды: моя локальная, сервер разработки и рабочий сервер. Пока у меня есть 3 файла свойств с именем

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

У меня есть их так:

    <?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>

Это прекрасно работает, когда я нахожусь на моей локальной машине. Если я развертываю файл war в разработке, он все еще читает свойства localhost, так как он последний в списке, и я получаю ошибку. Каков наилучший способ реализовать это?

Спасибо

Ответы [ 6 ]

15 голосов
/ 26 августа 2011

Для источников данных самым простым способом было бы определить источники данных и позволить контейнеру управлять пулами соединений.

Для этого определите ссылку на ресурс для источника данных в 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>

и ссылаться на него весной следующим образом:

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

, тогда вы можете определить источник данных на сервере приложений, что означает, что вы можете изменить базовую базу данных.В случае веб-сферы это будет сделано через консоль веб-сферы.В случае tomcat это будет сделано через 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>

Таким образом, вам нужно всего лишь изменить контекст для развертывания в разработке, тестировании и производстве и не привязывать ваше приложение кконкретная база данных.

4 голосов
/ 26 августа 2011

Передайте системное свойство заполнителю свойства, но включите все три файла в WAR:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
           <value>classpath:/resources/properties/${myenv}.datasource.properties</value>
        </list>
    </property>
</bean>
2 голосов
/ 26 августа 2011

В других ответах здесь есть хорошие идеи, но я отвечаю, потому что мой собственный подход является чем-то вроде комбинации трех.Во-первых, не следует ссылаться на файлы свойств нескольких сред непосредственно в Spring XML.Просто работай из одного файла.Затем, используя комбинацию Spring * <context:property-placeholder>, <jee:jndi-lookup>, <util:properties> и SpEL, вы можете легко настроить очень гибкую конфигурацию.

  1. <context:property-placeholder> подключается к выходу<util:properties>.
  2. <util:properties> использует SpEL для проверки системного свойства с заданным именем.Если доступно, он использует его как местоположение файла свойств для загрузки.Если нет, то
  3. Отойдите к <jee:jndi-lookup>, который пытается выполнить поиск местоположения в JDNI.Если это также ничего не находит, тогда
  4. По умолчанию - жестко закодированное местоположение пути к классу, заданное атрибутом default-value <jee:jndi-lookup>.

Эта настройка упрощаетуказать расположение файла свойств независимо от того, в какой среде вы находитесь из-за всех параметров.

2 голосов
/ 26 августа 2011

Посмотрите здесь: http://blog.jayway.com/2010/10/21/environment-specific-configuration-of-spring-applications/ Вы можете иметь конфигурацию по умолчанию в своем приложении и, при желании, переопределить ее файлом в предопределенном месте в вашей файловой системе.

2 голосов
/ 26 августа 2011

Два решения

  • Имеет одно значение вместо трех с общим именем и в вашей конфигурации сборки укажите флаг, какой файл свойств должен быть скопирован в этот путь / имя файла.

  • Укажите свойства в качестве аргумента виртуальной машины при запуске сервера, например -Ddatasource.properties = C: \ Config \ development.datasource.properties и в вашем XML-файле конфигурации file: /// $ {datasource.properties}

0 голосов
/ 21 марта 2012

Я бы подумал об использовании Cocoon Spring Configurator, который можно использовать автономно, без остальной части проекта Cocoon:

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

Я нашел этот пост очень полезнымДля начала:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...