Spring Конфигурация источника данных для локального хоста, разработки и производства
Я пытаюсь выяснить, как мое приложение Spring может определить, где оно развернуто, и загрузить соответствующий источник данных. У нас есть 3 среды... мой локальный, сервер разработки и производственный сервер. Пока у меня есть 3 файла свойств под названием
localhost.datasource.properties
development.datasource.properties
production.datasource.properties
У меня есть их conifgured вот так:
<?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>
Это отлично работает, когда я нахожусь на своей машине localhost. Если я развертываю военный файл для разработки, он все еще читает свойства localhost, так как он последний в списке, и я получаю сообщение об ошибке. Каков наилучший способ реализовать это?
Спасибо
Ответы
Ответ 1
Для источников данных самым простым способом было бы определить источники данных и позволить контейнеру управлять пулом соединений.
Для этого определите ссылку ресурса на источник данных в 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>
и ссылайтесь на него в spring как таковой:
<jee:jndi-lookup
id="dataSource"
jndi-name="jdbc/MyDataSource" />
то вы можете определить источник данных на сервере приложений, что означает, что вы можете изменить базовую базу данных. В случае с websphere это будет сделано через консоль websphere. В случае 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>
Таким образом вам нужно всего лишь изменить контекст для развертывания для разработки, тестирования и производства и не привязывать ваше приложение к конкретной базе данных.
Ответ 2
Передайте системное свойство заполнителю свойства, но включите все три файла в WAR:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/resources/properties/${myenv}.datasource.properties</value>
</list>
</property>
</bean>
Ответ 3
Два решения
-
У вас есть одно значение вместо трех с общим именем и в конфигурации сборки укажите флаг, файл свойств которого должен быть скопирован в этот путь/имя файла.
-
Предоставлять свойства как аргумент виртуальной машины при запуске сервера, например
-Ddatasource.properties = C:\Config\development.datasource.properties
и в вашем файле конфигурации XML <value> file:///${datasource.properties} </value>
Ответ 4
Посмотрите здесь: http://blog.jayway.com/2010/10/21/environment-specific-configuration-of-spring-applications/
Вы можете иметь конфигурацию по умолчанию в своем приложении и необязательно переопределять ее с файлом в предопределенном месте в вашей файловой системе.
Ответ 5
В других ответах здесь есть хорошие идеи, но я отвечаю, потому что мой собственный подход - это нечто из трех. Во-первых, не ссылайтесь на файлы свойств нескольких сред непосредственно в XML Spring. Просто работайте из одного файла. Затем, используя комбинацию Spring <context:property-placeholder>
, <jee:jndi-lookup>
, <util:properties>
и SpEL, вы можете легко настроить очень гибкую конфигурацию.
-
<context:property-placeholder>
подключается к выходу <util:properties>
.
-
<util:properties>
использует SpEL для проверки системного свойства с заданным именем. Если доступно, он использует это как местоположение файла свойств для загрузки. Если нет,
- Вернитесь к
<jee:jndi-lookup>
, который пытается выполнить поиск JDNI для местоположения. Если это также не находит ничего, тогда
- По умолчанию используется жестко закодированное расположение пути к траектории, заданное атрибутом
default-value
<jee:jndi-lookup>
.
Эта настройка упрощает определение местоположения файла свойств независимо от того, в какой среде вы находитесь, из-за всех параметров.
Ответ 6
Я хотел бы использовать конфигуратор Cocoon Spring, который можно использовать автономно, без остальной части проекта Cocoon:
http://cocoon.apache.org/subprojects/configuration/spring-configurator/index.html
Я нашел это сообщение в блоге очень полезным для начала:
http://mrhaki.blogspot.com/2009/02/use-spring-configurator-to-support.html