2012-01-16 16 views
0

IOCにspringを使用したアプリケーションがあります。 applicationContext.xmlにdataSource 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が見えます:

は、DataSourceビーンdefinationは次のようになります

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分かかります。プールの作成は最初の呼び出しで行われ、"initialSize" = 50applicationConext.xmlに設定されているからです。

これを回避するには、アプリケーションの起動時にプールを作成して直接使用できる方法が必要です。

お勧めします。何か明確化が必要な場合はお知らせください。

よろしく Sarojは

+0

春は、デフォルトでは熱心なシングルトン豆の作成/初期化を行います。他の何かが遅延を引き起こしているはずです。 – soulcheck

+0

こんにちは、Soulcheck、 多くのお世話になります。しかし、initialSizeパラメータの値を1にしてコードをテストし、時間が6秒に短縮されました。 – user1061771

答えて

4

起動時に DB接続を使用するようにjdbcTemplateを強制することができ、この。あなたのための回避策があります。詳細はリンクhereを参照してください。

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

2番目のconstructor-argは、遅延遅延フラグです。

+0

こんにちはAravind、あなたの入力のための多くのThanx。私はこれをちょうどやったが、今はうまくいっている。これで、サーバーの起動時にdataSourceが注入され、そこではアプリケーションのパフォーマンスが向上します。もう一度あなたの助けを借りて多くのことをしてください。私はappriciate! – user1061771

+0

@ user1061771いつも歓迎:)。私が助けることができてうれしいです。 –

+1

愚かな質問を申し訳ありません...あなたは代わりに春の注釈を使用しますか?どうもありがとう! –

0

Aravind Aのソリューションを兼ね備え1ですが、念のためにあなたが余分なBeanを定義したくないあなたは、あなたのDAOのinitメソッドに春を指すことができます:

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

、その後、いくつかを呼び出すServiceDAOImpl.init()を定義しますSELECT 1 FROM SERVICE_LOOKUP LIMIT 1またはより良いSELECT 1のようないくつかのNOOPのようなSQL:コンテキストが読み込まれ、構成されている場合、プールが作成されるように

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

     int i = jdbcTemplate.queryForInt(query); 
    } 
} 
関連する問題