用于localhost,开发和生产的Spring数据源配置

时间:2011-08-25 19:47:47

标签: java spring configuration datasource

我正在试图弄清楚我的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>

当我在我的localhost机器上时这很好用。如果我将war文件部署到开发中,它仍然在读取localhost属性,因为它是列表中的最后一个,我收到错误。实现这个的最佳方法是什么?

由于

6 个答案:

答案 0 :(得分:15)

对于数据源,最简单的方法是定义数据源并让容器管理连接池。

为此,请在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" />

然后您可以在应用程序服务器中定义数据源,这意味着您可以更改基础数据库。对于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>

这样,您只需要更改上下文以部署到开发,测试和生产,并且不要将应用程序绑定到特定数据库。

答案 1 :(得分:4)

将系统属性传递给属性占位符,但包括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 :(得分:2)

两种解决方案

  • 使用通用名称设置一个值而不是三个值,并在构建配置中提供一个标志,应将属性文件复制到该路径/文件名。

  • 在启动服务器时将属性作为VM参数提供 -Ddatasource.properties = C:\设置\ development.datasource.properties 并在您的XML配置文件&lt; value&gt; file:/// $ {datasource.properties}&lt; / value&gt;

答案 3 :(得分:2)

看看这里:http://blog.jayway.com/2010/10/21/environment-specific-configuration-of-spring-applications/ 您可以在应用中使用默认配置,也可以选择使用文件系统上预定义位置的文件覆盖它。

答案 4 :(得分:2)

这里的其他答案都有很好的想法,但我回答是因为我自己的方法是三者的组合。首先,不要直接在Spring XML中引用多个环境的属性文件。只需从单个文件中工作即可。然后,结合使用Spring的<context:property-placeholder><jee:jndi-lookup><util:properties>和SpEL,您可以轻松设置非常灵活的配置。

  1. <context:property-placeholder><util:properties>
  2. 的输出相关联
  3. <util:properties>使用SpEL检查具有给定名称的系统属性。如果可用,它将其用作要加载的属性文件的位置。如果没有,
  4. 回退到<jee:jndi-lookup>,它尝试对该位置执行JDNI查找。如果那也找不到任何东西,那么
  5. 默认为default-value的{​​{1}}属性给出的硬编码类路径位置。
  6. 由于所有选项,无论您处于何种环境,此设置都可以轻松指定属性文件位置。

答案 5 :(得分:0)

我会考虑使用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