Spring Batch应用从配置文件获取MSSQL多环境Schema名称
解决Spring Batch中根据环境动态切换SQL Schema的问题
我来帮你搞定这个不同环境下切换MSSQL Schema的需求,其实借助Spring的属性占位符或者SpEL表达式就能轻松实现,下面是具体的操作步骤:
1. 配置环境专属的属性文件
首先得给DEV和PROD环境分别创建对应的配置文件,用来存放各自的Schema名称:
- 创建
application-dev.properties(开发环境):# 开发环境的Schema名称 db.schema=dbo_dev - 创建
application-prod.properties(生产环境):# 生产环境的Schema名称 db.schema=dbo_prod - 在主配置文件
application.properties里指定当前激活的环境:# 切换dev或prod即可切换环境配置 spring.profiles.active=dev
2. 修改XML作业配置中的SQL语句
接下来要把原来SQL里固定的dbo替换成从配置文件读取的动态属性,有两种常用方式:
方式一:使用Spring属性占位符${}
如果你的XML配置里还没引入属性占位符处理器,先加上这一行(Spring Boot项目可以跳过,默认已经配置):
<context:property-placeholder location="classpath:application-${spring.profiles.active}.properties"/>
然后修改dataItemWriter里的SQL配置:
<bean id="dataItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> <property name="assertUpdates" value="true" /> <property name="itemPreparedStatementSetter"> <bean class="org.test.batch.model.ItemStatementMapper" /> </property> <property name="sql" > <value> <![CDATA[ INSERT INTO ${db.schema}.EMPLOYEE (PROJECT_NAME ,APP_NAME ,EMPLOYEE_NAME) values (?,?,?) ]]> </value> </property> <property name="dataSource" ref="dataDataSource" /> </bean>
这样Spring会自动把${db.schema}替换成当前激活环境配置文件里的对应值。
方式二:使用SpEL表达式#{}
如果你更倾向于通过Spring的Environment对象读取属性,也可以用SpEL表达式:
<bean id="dataItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> <property name="assertUpdates" value="true" /> <property name="itemPreparedStatementSetter"> <bean class="org.test.batch.model.ItemStatementMapper" /> </property> <property name="sql" > <value> <![CDATA[ INSERT INTO #{environment.getProperty('db.schema')}.EMPLOYEE (PROJECT_NAME ,APP_NAME ,EMPLOYEE_NAME) values (?,?,?) ]]> </value> </property> <property name="dataSource" ref="dataDataSource" /> </bean>
这种方式不需要额外配置属性占位符处理器,直接通过Environment获取属性值。
3. 验证效果
当你需要切换环境时,只需要修改application.properties里的spring.profiles.active值为dev或prod,Spring就会自动加载对应的配置文件,SQL语句中的Schema名称也会随之切换,完美实现不同环境的配置隔离。
内容的提问来源于stack exchange,提问作者Rajar R
相关产品推荐
相关产品推荐

