Loading configuration properties from Database Table in Spring Application
This is better approach to store the configuration properties to a database table so that this can be managed easily.This post will explains the approach to store and retrieve the configuration properties from database table in spring project.
Bean definition in Spring context file:
Configure the below bean definition to the spring context file<!-- Loads properties to set environment-specific values within the DB table for that environment -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="properties">
<bean class="org.apache.commons.configuration.ConfigurationConverter"
factory-method="getProperties">
<constructor-arg>
<bean class="org.apache.commons.configuration.DatabaseConfiguration">
<constructor-arg>
<ref bean="propertyDataSource"/>
</constructor-arg>
<constructor-arg value="Properties"/> <!-- DB Table -->
<constructor-arg value="prop_key"/> <!-- DB Key Column -->
<constructor-arg value="prop_value"/> <!-- DB Value Column -->
</bean>
</constructor-arg>
</bean>
</property>
</bean>
Properties database table
The Properties database table should be pre-created with the required configuration valuesProp_key | Prop_value |
---|---|
ftp.host | localhost |
ftp.user | albin |
Data source configuration
The datasource ref bean propertyDataSource should be configured in the spring context file.<jee:jndi-lookup id="propertyDataSource" jndi-name="java:comp/env/jdbc/propertyDS"/>
Here i am using the Tomcat server, the actual datasource - jdbc/propertyDS should be configured in context.xml file of the Tomcat server.
<Resource name="jdbc/propertyDS "
auth="Container"
type="javax.sql.DataSource"
username="property_user"
password="property "
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=Soa"
maxActive="4"
maxIdle="2"/>
Refer the properties
Now the properties can be referred as shown below
<bean id="ftp" class="com.doc.FTPService">
<property name="host" value="${ftp.host}"/>
<property name="user" value="${ftp.user}"/>
</bean>
thanks~~~~~~~~~~
ReplyDeleteHi there, Thanks for the post. It worked like a charm. But, can you please suggest same configuration using Java Config.
ReplyDeleteThanks
Does this approach have any performance implication? Will it get all the properties in one go? Or will it issue separate SQL queries for each "getProperty" call? Is it possible to load and cache all the properties in one DB call?
ReplyDeletewhat is the approach...with out using jndi
ReplyDeletegreat
ReplyDelete