4

目前我们正在从属性文件中加载我们的 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 文件一起工作并摆脱 app.properties。

我们想从 context.xml 加载这些值(放置在META-INF或中$CATALINA_HOME/conf/context.xml)。它将帮助我们在 prod/staging 服务器上加载正确的值。

将不胜感激任何帮助或替代方法/建议。(如果已经回答了类似的问题,请分享链接)谢谢!

4

3 回答 3

3

我这样做的方式是,我的类路径中有默认属性文件,并且我有一个属性文件用于覆盖这些默认(开发)属性:

在我的弹簧文件中:

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

在开发中,我使用类路径中的属性文件。
在不同的环境、暂存、集成、生产中,我们使用以下参数启动应用程序:

-Dexternal_config=file:c:/staging.properties

这样我对所有环境都有相同的构建,并且可以选择我的覆盖属性文件的位置。

因此,${external_config}是依赖于环境的配置文件的占位符。Spring 寻找一个名为 external_config 的环境变量,该变量应该指向一个配置文件。如果未找到该文件,Spring 将使用 ignoreResourceNotFound = true 忽略它;

于 2013-10-15T17:42:13.190 回答
3

正如 Alan Hay 提到的,您可以将数据源配置外部化到 Tomcat 自己的 context.xml 中,然后让 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 config 以在 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

由于数据源配置现在由容器管理,因此您应该将数据库驱动程序和数据源 jar 放入 $CATALINA_HOME/lib 以便 Tomcat 在创建数据源时可以使用它们。这些 jar 不再需要驻留在应用程序的 WEB-INF/lib 中。

于 2013-10-16T13:09:27.870 回答
1

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 查找的容器管理的连接池,即在每个服务器上定义一个名为 xyz 的 JNDI 数据源,然后:

于 2013-10-15T21:47:38.293 回答