Инициализация источника данных при запуске сервера - PullRequest
0 голосов
/ 16 января 2012

У нас есть приложение, в котором мы использовали пружину для МОК. У нас bean-компонент dataSource настроен в applicationContext.xml, и на него ссылаются другие определения bean-компонента.

Определение bean-компонента dataSource выглядит следующим образом:

    <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 минут. Я думаю, это потому, что создание пула выполняется во время первого вызова, и мы установили параметр "initialSize" = 50 в applicationConext.xml.

Итак, чтобы избежать этого, нам нужен способ, которым пул может быть создан во время самого запуска приложения и может использоваться напрямую.

Пожалуйста, предложите. Дайте мне знать, если потребуется какое-либо разъяснение.

С уважением * Сара * 1017

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Для этого есть обходной путь. Вы можете заставить jdbcTemplate использовать Подключение к БД при запуске. См. Ссылку здесь для подробного объяснения.

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

Второй аргумент-конструктор - это ленивый флаг Init.

0 голосов
/ 16 января 2012

Решение Аравинда А является предпочтительным, но на тот случай, если вы не хотите определять дополнительный компонент, вы можете указать пружину на метод init вашего DAO:

<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);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...