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" = 50
はapplicationConext.xml
に設定されているからです。
これを回避するには、アプリケーションの起動時にプールを作成して直接使用できる方法が必要です。
お勧めします。何か明確化が必要な場合はお知らせください。
よろしく Sarojは
春は、デフォルトでは熱心なシングルトン豆の作成/初期化を行います。他の何かが遅延を引き起こしているはずです。 – soulcheck
こんにちは、Soulcheck、 多くのお世話になります。しかし、initialSizeパラメータの値を1にしてコードをテストし、時間が6秒に短縮されました。 – user1061771