如何动态选择要使用的数据库

时间:2013-08-22 19:56:50

标签: spring hibernate

我有一个带有弹簧项目的可执行Jar。 有一个属性文件,它为代码提供变量,并且与jar存在于同一目录中。一切都很好。在java代码中,我将属性文件加载为:

Properties properties = new Properties();
properties.load(new FileInputStream(PROPERTY_FILE_NAME));

applicationContext.xml中的我的数据源是

 <bean id="teDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/testDB"/>
    <property name="username" value="t"/>
    <property name="password" value="t"/>
    <property name="initialSize" value="5"/>
    <property name="maxActive" value="10"/>
</bean> 

hibernate属性是:

   <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
    <props>    
   <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>    
   <!-- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> -->
    <prop key="hibernate.jdbc.fetch_size">250</prop>....

以上所有内容都适用于MySql或Oracle,并且更改方言(下面注释的prop键)将进行切换。但现在我希望能够根据属性文件中的属性选择数据库。在我的场景中,我怎样才能做到这一点?

版本:

spring - 3.0.5.RELEASE
hibernate - 3.3.2.GA

2 个答案:

答案 0 :(得分:2)

您应该拥有应用程序中依赖于环境的所有内容(例如,数据库配置,服务器的绝对路径,外部WebService URL等)。

这通常可以使用标准Java属性文件来完成。然后,您可以使用PropertyPlaceholderConfigurer加载它,并在您需要配置内容的bean配置中的任何位置使用${config.myproperty}样式。

在启动应用程序时,您必须为其提供此配置文件的路径,或者它也可以存在于默认路径中(约定优于配置)。

答案 1 :(得分:2)

您可以使用maven配置构建,其中包含个人资料:

<profiles>  
<profile>
            <id>database1</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>db1.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>database2</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>db2.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

在db1.properties文件中,您为第一个数据库提供所有配置,在db2.properties中提供另一个配置。

例如,您可以: db1.properties中的database.name = jdbc:mysql:// localhost:3306 / testDB1 db2.properties中的database.name = jdbc:mysql:// localhost:3306 / testDB2

在你的applicationContext文件中,你只需要这样: property name =“url”value =“$ {database.name}”