我们有一个应用程序,我们使用spring for IOC。我们在applicationContext.xml中配置了dataSource bean,并在其他bean definations中引用。
dataSource 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中使用dataSource时,连接正常。但是第一次进行数据库调用时,需要大约3分钟才能得到响应。我认为这是因为池创建是在第一次调用期间完成的,我们在"initialSize" = 50
中设置了参数applicationConext.xml
。
因此,为了避免这种情况,我们需要一种方法,可以在应用程序启动期间创建池,并且可以直接使用。
请建议。如果需要澄清,请告诉我。
此致 Saroj
答案 0 :(得分:4)
有一个解决方法。你可以强制jdbcTemplate使用 启动时的数据库连接。有关详细说明,请参阅链接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标志。
答案 1 :(得分:0)
Aravind A的解决方案是优先考虑的解决方案,但是如果你不想定义一个额外的bean,你可以指出你的DAO的init方法:
<bean id="serviceDAO" class="com.test.impl.ServiceDAOImpl" init-method="init">
<property name="dataSource" ref="dbDataSource" />
</bean>
然后定义ServiceDAOImpl.init()
调用某些sql,如SELECT 1 FROM SERVICE_LOOKUP LIMIT 1
,或者甚至更好一些noop,如SELECT 1
:
public class ServiceDAOImpl implements ServiceDAO {
public void init() {
String query = "SELECT 1 FROM SERVICE_LOOKUP LIMIT 1";
int i = jdbcTemplate.queryForInt(query);
}
}