Java 用于本地主机、开发和生产的Spring数据源配置

Java 用于本地主机、开发和生产的Spring数据源配置,java,spring,configuration,datasource,Java,Spring,Configuration,Datasource,我试图弄清楚我的Spring应用程序如何确定它部署在何处并加载适当的数据源。我们有3个环境…my local、开发服务器和生产服务器。到目前为止,我有3个名为 localhost.datasource.properties development.datasource.properties production.datasource.properties 我把它们做成这样: <?xml version="1.0" encoding="UTF-8"?> <beans x

我试图弄清楚我的Spring应用程序如何确定它部署在何处并加载适当的数据源。我们有3个环境…my local、开发服务器和生产服务器。到目前为止,我有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>

类路径:/resources/properties/production.datasource.properties
类路径:/resources/properties/development.datasource.properties
类路径:/resources/properties/localhost.datasource.properties
当我在本地主机上时,这可以正常工作。如果我将war文件部署到开发中,它仍在读取localhost属性,因为它是列表中的最后一个,我得到一个错误。实现这一点的最佳方式是什么

谢谢

两种解决方案

  • 使用一个值而不是三个通用名称,并在生成配置中提供一个标志,指示哪些属性文件应复制到该路径/文件名

  • 在启动服务器时将属性作为VM参数提供,如 -Ddatasource.properties=c:\config\development.datasource.properties 在XML配置文件中://${datasource.properties}

看看这里:
您可以在应用程序中使用默认配置,并可以选择在文件系统的预定义位置使用文件覆盖它。

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

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

数据库连接
jdbc/MyDataSource
javax.sql.DataSource
容器
并在春季将其作为参考:

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

...

这样,您只需更改部署到开发、测试和生产环境的上下文,而不必将应用程序绑定到特定的数据库。

这里的其他答案都有很好的想法,但我的回答是因为我自己的方法是这三者的结合。首先,不要在SpringXML中直接引用多个环境的属性文件。从一个文件开始工作。然后,结合使用Spring的
和SpEL,您可以轻松地设置非常灵活的配置

  • 的输出连接
  • 使用SpEL检查具有给定名称的系统属性。如果可用,它将其用作要加载的属性文件的位置。如果没有,
  • 回到
    ,它尝试对位置执行JDNI查找。如果那也找不到任何东西,那么
  • 默认为硬编码的类路径位置,由
    默认值
    属性给出

  • 由于所有选项,此设置使得指定属性文件位置变得简单,无论您处于何种环境。

    将系统属性传递给属性占位符,但在WAR中包括所有三个文件:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
               <value>classpath:/resources/properties/${myenv}.datasource.properties</value>
            </list>
        </property>
    </bean>
    
    
    类路径:/resources/properties/${myenv}.datasource.properties
    
    <代码> > p>我会考虑使用茧弹簧配置器,它可以独立使用,而不需要其他茧项目:

    我发现这篇博文对入门非常有用:


    这是一个较新的项目。目前我们正在部署war文件。我们计划在构建过程中使用maven,然后我们就可以这样做了。我想知道如何在这个特殊的用例中使用spring。谢谢你的邀请response@blong84看看我更新的帖子,第二个项目符号可能会引起您的兴趣。对于-D系统属性选项,您也可以在SpringXML文件中有
    ${datasource.properties}
    。然后可以将属性设置为
    file:///whatever
    用于开发和
    classpath:file\u in\u war.properties
    用于生产。这是可能的,但Farmor的方法更好。我认为使用这种方法可以覆盖默认值一次。感谢您的回复。你介意发布一些示例代码吗?