我有一个弹簧批量申请。用于存储spring批处理作业的元数据的数据库配置如下:
在application-context.xml中:
<!-- stored job-meta in database - H2 -->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSourceMetaData" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseType" value="h2" />
</bean>
在database.xml中:
<!-- configure H2 database connection -->
<bean id="dataSourceMetaData"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/metaDataProd" />
</bean>
现在,应用程序可以在多个实例中的相同环境中运行,例如:prod&amp;一个测试实例。所以我必须使value="jdbc:h2:~/metaDataProd
可配置,以便两个实例都不访问同一个数据库。
如果我从配置文件生成值,我可以很容易地做到这一点。但我想知道是否有任何自动方式这样做。例如:启动应用程序实例时,会按照value="jdbc:h2:~/metaData2Jul
value="jdbc:h2:~/metaData4Jul
答案 0 :(得分:2)
您可以使用PropertySourcesPlaceholderConfigurer并从各种来源初始化值,例如环境变量,外部属性文件等。然后使用$ {propname}占位符代替硬编码值。
如果您不需要区分实例但只是希望它们不同,那么使用SpEL的方法非常简单。以下任何一项都可以完成这项工作:
<property name="url" value="#{ 'jdbc:h2:~/metaData' + T(java.lang.System).nanoTime() }" />
或
<property name="url" value="#{ 'jdbc:h2:~/metaData-' + T(java.util.UUID).randomUUID() }" />
或
<property name="url" value="#{ 'jdbc:h2:~/metaData-' + (new java.text.SimpleDateFormat('ddmm_hh_mm_ss')).format(new java.util.Date()) }" />
如果您无法控制spring.xml或应用程序但可以在启动之前执行某些脚本,则可以在脚本中生成名称并替换xml中的jdbc url值(取决于脚本语言,有无穷无尽的解决方案在这里SO)。
答案 1 :(得分:0)
您可以为此指定JNDI属性并在init uisng initialContext()方法中加载该属性,如下所示:
new InitialContext(environment).lookup(myServiceJndiName);
在本案例测试环境或生产环境中,您可以为不同的环境指定不同的jndi值。