【问题标题】:Load Table content from Oracle DB to Spring Bean on server run在服务器运行时将表内容从 Oracle DB 加载到 Spring Bean
【发布时间】:2013-09-10 00:01:45
【问题描述】:
  1. 我在Oracle11 DataBase 中有一个表格,有两列 (KEY(varchar2),PROPERTY(varchar2))。
  2. 通过使用 Spring 框架,我想将表中的全部内容(所有行)加载到 Spring Bean 中,这样我就可以使用 Bean,而不是一直从 DataBase 获取值。
  3. 我使用了 Bean 类“org.apache.commons.configuration.DatabaseConfiguration”。它工作正常,但这个 bean 类没有将整个表格内容加载到其中的规定。

PFB,我的 Spring-config.xml:

 <bean name="propertyPlaceholderConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="properties" ref="commonsConfigurationFactoryBean"/>
        </bean>

<bean name="commonsConfigurationFactoryBean"
    class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean">
<constructor-arg ref="databaseConfiguration"/>
</bean>

<bean name="databaseConfiguration"
            class="org.apache.commons.configuration.DatabaseConfiguration">
        <constructor-arg type="javax.sql.DataSource" ref="dataSource"/>
        <constructor-arg type="java.lang.String" index="1" value="schema.Table_Name1"/>
        <constructor-arg type="java.lang.String" index="2"  value="KEY"/>
        <constructor-arg type="java.lang.String" index="3" value="PROPERTY"/>
</bean>

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:SYSTEM_NS:PORT:sid"/>
        <property name="username" value="xxxx"/>
        <property name="password" value="xxxx"/>
    </bean>

Java 代码:

ApplicationContext classpathCtx = new ClassPathXmlApplicationContext("Spring-config.xml");
DatabaseConfiguration dBConfig = (DatabaseConfiguration)classpathCtx.getBean("databaseConfiguration");

// To display the value in the property column by sending the value of column KEY
System.out.println(dBConfig.getProperty("Value in the KEY column"));

上面的代码工作正常。但是每次我将密钥发送到 DatabaseConfiguration 时,它都会在内部进行 DataBase 调用以获取我不希望发生的属性。

整个上述概念都是关于尝试将 .properties 中存在的所有数据存储到 DB 中,并将其从 DB 中提取到我的 Java 代码中。

【问题讨论】:

    标签: java spring spring-mvc spring-webflow


    【解决方案1】:

    您可以创建一个 FactoryBean,通过从 databaseConfiguration 读取所有键并将它们复制到创建的属性对象来创建属性对象。

    这个属性对象是一个单例,可以在你的 spring 配置中使用。

    <bean name="properties" class="...ConfigurationPropertiesFactoryBean">
       <property name="configuration" ref="databaseConfiguration"/>
    </bean>
    
    public class ConfigurationPropertiesFactoryBean implements FactoryBean<Properties>
    {
       private Properties props = new Properties();
       public void setConfiguration(Configuration configuration)
       {
         props.put ...
       }
       public Properties getObject()
       {
          return props;
       }
    } 
    

    或者,您可以使用 JdbcTemplate 来代替 DatabaseConfiguration:

    <bean name="properties" class="...DataSourcePropertiesFactoryBean">
       <property name="dataSource" ref="dataSource"/>
    </bean>
    
    public class DataSourcePropertiesFactoryBean implements FactoryBean<Properties>
    {
       private Properties props = new Properties();
       public void setDataSource(DataSource dataSource)
       {
         props = new JdbcTemplate(dataSource).query("SELECT KEY, PROPERTY FROM ...", 
           new ResultSetExtractor(){
            public void Properties extractData(ResultSet rs)
            {
               props.put(...);
            }
         });
       }
       public Properties getObject()
       {
          return props;
       }
    } 
    

    【讨论】:

    • 是的,我接受按照您指导的方式创建单例 obj,但在您给出的代码中,我们是 ""指的是 databaseConfigurationBean 没有规定加载所有行,即来自 dB 的所有键值对......假设我们在 dB 中有 100 个键值对。然后加载所有行必须进行 100 dB 调用。我的重点是找到一种使用 Spring 在一个 dB 调用中加载所有行的方法。
    • 添加了第二个替代方案,使用 JdbcTemplate 进行单个 SQL 查询以一次获取所有键值对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多