Загрузка значений свойств Бина из context.xml
В настоящее время мы загружаем исходные значения JDBC из файла свойств следующим образом:
<context:property-placeholder location="classpath:master.properties" ignore-unresolvable="true" />
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${database.driver}" />
<property name="jdbcUrl" value="${database.url}" />
<property name="username" value="${database.user}" />
<property name="password" value="${database.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="2" />
<property name="minConnectionsPerPartition" value="2" />
<property name="partitionCount" value="3" />
<property name="acquireIncrement" value="10" />
<property name="statementsCacheSize" value="50" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"
scope="singleton">
<property name="targetDataSource">
<ref local="mainDataSource" />
</property>
</bean>
Это сег. отлично работает с файлом app.properties на основе classpath и избавляется от app.properties.
Мы хотели бы загрузить эти значения из context.xml (либо помещены в META-INF
или же $CATALINA_HOME/conf/context.xml
). Это поможет нам загрузить правильные значения на серверах prod/staging.
Буду признателен за любую помощь или альтернативный метод / предложения. (Если на аналогичный вопрос уже дан ответ, поделитесь ссылкой) Спасибо!
3 ответа
Как упомянул Алан Хей, вы можете перенести конфигурацию источника данных в собственный context.xml Tomcat, а затем заставить Spring выполнить поиск JNDI для его получения. Этот подход я обычно использовал в некоторых проектах, над которыми работал.
Куски, которые вам нужно поставить на место, будут:
1. Добавьте конфигурацию источника данных в $ CATALINA_HOME / conf / context.xml
<GlobalNamingResources>
<Resource type="javax.sql.DataSource"
name="dsName"
factory="com.jolbox.bonecp.BoneCPDataSource"
driverClassName="your.driver.classname"
jdbcUrl="your:driver:url"
username="username"
password="password"
idleMaxAge="240"
idleConnectionTestPeriod="60"
partitionCount="3"
acquireIncrement="10"
maxConnectionsPerPartition="2"
minConnectionsPerPartition="2"
statementsCacheSize="50"
releaseHelperThreads="3" />
</GlobalNamingResources>
2. Добавьте ссылку на ресурс в META-INF/context.xml приложения.
<Context path="/YourApp">
<ResourceLink description="Datasource for YourApp"
global="jdbc/dsName"
name="jdbc/dsName"
type="javax.sql.DataSource" />
</Context>
3. Измените конфигурацию Spring для поиска источника данных в JNDI
<beans xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee classpath:/org/springframework/ejb/config/spring-jee-3.0.xsd">
<jee:jndi-lookup id="dataSource"
jndi-name="java:comp/env/jdbc/dsName" />
4. Переместите банки с драйверами и источниками данных.
Поскольку конфигурация источника данных теперь управляется контейнером, вы должны поместить драйвер базы данных и jar источника данных в $CATALINA_HOME/lib, чтобы они были доступны для Tomcat при создании источника данных. Эти банки больше не должны находиться в WEB-INF/lib вашего приложения.
Как я это делаю, у меня есть файл свойств по умолчанию в моем classpath, и у меня есть один файл свойств, который я использую для переопределения этих свойств по умолчанию (разработка):
в моем весеннем файле:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:camel.properties</value>
<value>classpath:email.properties</value>
<value>${external_config}</value>
</list>
</property>
</bean>
В разработке я использую файл свойств в classpath.
При различных обстоятельствах, постановке, интеграции, производстве мы запускаем приложение со следующим параметром:
-Dexternal_config=file:c:/staging.properties
Таким образом, у меня одна и та же сборка для всех сред и я могу выбрать расположение моего файла переопределенных свойств.
Так, ${external_config}
является заполнителем для файла конфигурации, который зависит от среды.
Spring ищет переменную среды с именем external_config, которая должна указывать на файл конфигурации. Если файл не найден, Spring игнорирует его с помощью ignoreResourceNotFound = true;
В Spring 3.1 появилась поддержка профилей, специфичных для среды. Определите некоторые профили, свяжите их с некоторыми файлами свойств, например, test.properties, live.properties и установите переменную среды при запуске сервера -Dspring.profiles.active=Test. Чисто и просто.
http://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/
Другой вариант, о котором говорилось выше, состоит в том, чтобы перейти к управляемому контейнером пулу подключений, который ищется через JNDI, то есть определить источник данных JNDI с именем xyz одинаковым на каждом сервере, а затем: