服务器启动时的数据源初始化

时间:2012-01-16 12:23:52

标签: spring initialization datasource

我们有一个应用程序,我们使用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

2 个答案:

答案 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);
     }
}