2012-01-16 92 views
0

我們必須在這裏我們使用了彈簧IOC的應用程序。我們在applicationContext.xml中配置了dataSource bean,並在其他bean定義中引用它。數據源初始化啓動

數據源bean認定中的樣子:

<bean id="dbDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="url" 
      value="jdbc:oracle:oci:@TESTDB" /> 
     <property name="username" value="TESTUSER" /> 
     <property name="password" value="TESTPWD" /> 
     <property name="initialSize" value="50" /> 
     <property name="maxActive" value="40" /> 
     <property name="maxIdle" value="10" /> 
     <property name="minIdle" value="10" /> 
     <property name="maxWait" value="-1" /> 
    </bean> 
    <bean id="serviceDAO" class="com.test.impl.ServiceDAOImpl"> 
     <property name="dataSource" ref="dbDataSource" /> 
    </bean> 

ServiceDAOImpl如下所示:

public class ServiceDAOImpl implements ServiceDAO { 


    private JdbcTemplate jdbcTemplate; 

    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public ValueObj readValue(String key) { 

     String query = "SELECT * FROM SERVICE_LOOKUP WHERE KEY=?"; 
     /** 
     * Implement the RowMapper callback interface 
     */ 
     return (ValueObj) jdbcTemplate.queryForObject(query, 
       new Object[] { key }, new RowMapper() { 
        public Object mapRow(ResultSet resultSet, int rowNum) 
          throws SQLException { 
         return new ValueObj(resultSet.getString("KEY"), 
           resultSet.getString("VALUE")); 
        } 
       }); 
    } 
    public ServiceDAOImpl() { 

    } 
} 

現在,在服務器啓動時注入正在發生細微而當我們使用數據源中serviceDAOImpl的連接正在發生。但是,第一次進行數據庫調用需要大約3分鐘才能獲得響應。我想,這是因爲池創建的第一個電話中進行,我們在applicationConext.xml設置參數"initialSize" = 50

因此,爲了避免這一點,我們需要能夠在應用程序啓動時創建本身可直接使用的池的方式。

請建議。如果需要澄清,請告知我。

問候 Saroj

+0

春天確實渴望單身bean創建/默認初始化所以創建池時被讀取並配置了環境。還有其他一些事情必須導致延遲。 – soulcheck 2012-01-16 12:34:42

+0

Soulcheck嗨, 許多感謝名單爲您回覆。但我已經用initialSize參數值爲1測試了代碼,時間縮短爲6秒。 – user1061771 2012-01-16 13:19:29

回答

4

有一個解決這個。你可能會迫使JdbcTemplate的使用在啓動時 DB連接。有關詳細說明,請參閱鏈接here

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <constructor-arg index="0" ref="dataSource"/> 
    <constructor-arg index="1" value="false"/> 
</bean> 

第二個構造函數arg是懶惰的Init標誌。

+0

亞拉文你好,感謝名單很多關於您的輸入。我已經完成了這個,現在它工作正常。現在,在服務器啓動期間注入數據源,從而提高應用程序的性能。再次感謝您的幫助。我appriciate !!! – user1061771 2012-01-18 09:19:17

+0

@ user1061771隨時歡迎:)。我很高興我能提供幫助。 – 2012-01-18 09:40:16

+1

對不起,愚蠢的問題......你會怎麼用彈簧註釋,而不是這樣做?非常感謝! – 2015-06-15 13:05:17

0

亞拉文A的解決方案是優先停留之一,但以防萬一你不希望定義一個額外的豆你可以點春天的DAO的init方法:

<bean id="serviceDAO" class="com.test.impl.ServiceDAOImpl" init-method="init"> 
    <property name="dataSource" ref="dbDataSource" /> 
</bean> 

,然後定義ServiceDAOImpl.init()這就要求一些SQL LIKE SELECT 1 FROM SERVICE_LOOKUP LIMIT 1,甚至更好一些空操作,像SELECT 1

public class ServiceDAOImpl implements ServiceDAO { 
    public void init() { 
     String query = "SELECT 1 FROM SERVICE_LOOKUP LIMIT 1"; 

     int i = jdbcTemplate.queryForInt(query); 
    } 
}