在spring应用程序中存储数据库密码或使用JNDI的位置?

时间:2010-02-24 20:36:49

标签: spring

似乎是一项简单的任务。我有一个需要数据库连接的webapp。我希望能够在此应用服务器上删除更新的.war文件并加载新版本,而无需重新编辑applicationConfig.xml文件以指定生产的数据库连接参数。

使用容器设置数据源,然后从JNDI引用它是首选方式吗?我认为在spring .xml文件中定义它是更干净的,但我不能想出一个干净的方法来允许在我们推出新版本时只设置一次生产密码。

那么,如何在spring应用程序中指定数据库连接信息,以便可以升级它而无需重新编辑文件?

如果您使用JNDI,您如何处理设置测试,因为JNDI不会在容器外可用?

谢谢!

2 个答案:

答案 0 :(得分:2)

外部化数据库连接属性的典型方法是将它们存储在.properties文件中并使用<context:property-placeholder .../>加载。然后,您可以使用不同的.properties文件进行测试和生产。

如果选择JNDI,可以使用Spring的mock JNDI support进行测试。

答案 1 :(得分:0)

一种方法是使Spring配置文件为与应用程序中特定层相关的片段composed

一个这样的片段可能包含您的DataSource定义。对于生产,此片段将使用jee:jndi-lookup。然后进行测试,让不同的片段使用DriverManagerDataSource

更新

如果你想在部署之后更改数据源,那么你可以使用这种技术,同时使用PropertyPlaceholderConfigurer更改将哪个数据源注入到其他bean中,正如我写的旧post中所解释的那样

例如:

<bean class="foo.bar.SomeClassNeedingDataSource"">
    <property name="dataSource" ref="${the.datasource.to.inject}" />
</bean>

<jee:jndi-lookup id="jndiDataSource" ... />

<bean id="driverManagerDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    ...
</bean>

# the properties file
the.datasource.to.inject = jndiDataSource
#the.datasource.to.inject = driverManagerDataSource