Источник данных Jboss, восстанавливающийся после перезапуска базы данных

Закрытые соединения все еще в пуле соединения - почему?

сервлет -

public class Index extends HttpServlet {

    TimeZoneService timeZoneService;

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException {
        WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
        timeZoneService = (TimeZoneService) ctx.getBean("timeZoneService");
        timeZoneService.loadAllTimeZones();
        System.out.println("Done");
    }
}

public interface TimeZoneService {
    void loadAllTimeZones();
}

public class TimeZoneServiceImpl implements TimeZoneService {

    private TimeZoneDao tzDao;
    private Map<Long, String> tzOid2JavaName = new HashMap<Long, String>();

    public void loadAllTimeZones() {
        List<TimeZone> timeZones = tzDao.findAllTimeZones();
        for (TimeZone tz : timeZones) {
            tzOid2JavaName.put(tz.getOid(), tz.getJavaName());
        }
    }

    public void setTzDao(TimeZoneDao tzDao) {
        this.tzDao = tzDao;
    }
}

public interface TimeZoneDao {
    List<TimeZone> findAllTimeZones() throws DataAccessException;  
}

public class TimeZoneDaoImpl extends JdbcDaoSupport implements TimeZoneDao {

    public List<TimeZone> findAllTimeZones() throws DataAccessException
    {
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT TZ.OID, TZ.JAVA_NAME FROM TIME_ZONE TZ");
        List<TimeZone> timeZones = getJdbcTemplate().query(sql.toString(), new RowMapper() {
            public Object mapRow(ResultSet rs, int i) throws SQLException {
                TimeZone tz = new TimeZone();
                tz.setOid(rs.getLong("OID"));
                tz.setJavaName(rs.getString("JAVA_NAME"));
                return tz;
            }
        });

        return timeZones;
    }
}

public class TimeZone {
    private Long oid;
    private String javaName;

    public Long getOid() {
        return this.oid;
    }

    public void setOid(Long oid) {
        this.oid = oid;
    }

    public String getJavaName() {
        return this.javaName;
    }

    public void setJavaName(String javaName) {
        this.javaName = javaName;
    }
}

spring-config.xml

<beans>

    <jee:jndi-lookup id="dataSource" jndi-name="java:/OracleDS"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="timeZoneDao" class="dao.impl.TimeZoneDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="timeZoneService" class="logic.impl.TimeZoneServiceImpl">
        <property name="tzDao" ref="timeZoneDao"/>
    </bean>

</beans>

web.xml

<web-app>

    <display-name>Spring</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            WEB-INF/spring-config.xml,classpath*:/META-INF/spring-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>index</servlet-name>
        <display-name>Index page</display-name>
        <description>Landing page</description>
        <servlet-class>servlet.Index</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>index</servlet-name>
        <url-pattern>/index</url-pattern>
    </servlet-mapping>

    <!-- Session Timeout (in minutes) -->
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
</web-app>

mysql-ds.xml

<datasources> 
   <local-tx-datasource> 
      <jndi-name>OracleDS</jndi-name> 
      <connection-url>jdbc:mysql://localhost:3306/spring</connection-url> 
      <driver-class>com.mysql.jdbc.Driver</driver-class> 
      <user-name>spring_test</user-name> 
      <password>spring_test13</password> 
      <min-pool-size>1</min-pool-size> 
      <max-pool-size>5</max-pool-size> 
      <idle-timeout-minutes>2</idle-timeout-minutes> 
   </local-tx-datasource> 
</datasources>
5
задан skaffman 24 January 2010 в 10:24
поделиться

2 ответа

Хорошо. Надеюсь, кому-то пригодится следующее :-)

Есть настройка конфигурации источника данных - exception-sorter-class-name

По словам Jboss, она используется для класса, который смотрит на сообщения конкретного производителя, чтобы определить, не фатальны ли sql-ошибки и, таким образом, соединение должно быть уничтожено. Если ни одна из них не указана, никакие ошибки не будут считаться фатальными.

Если используя базу данных Oracle эта конфигурация установлена на org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter. В этом классе есть все коды ошибок, которые должны рассматриваться как фатальные, и поэтому соединение должно быть уничтожено.

В Jboss 4 коды ошибок 17002 (сброс соединения) и 17008 (закрытие соединения) не включены. Они добавлены в Jboss 5. Поэтому, если вы используете Jboss 4 и удивляетесь, почему соединения не восстанавливаются, попробуйте добавить недостающие коды.

8
ответ дан 18 December 2019 в 14:46
поделиться

Это распространенная проблема, которая поставляется с использованием соединительного пула. Когда приложение заимствует соединение из пула, должен ли сам пул «тестировать» соединение, чтобы убедиться, что он все еще действителен, или он должен оставить это до приложения?

Если бассейн тестирует соединение, это неизбежно включает в себя отправку чего-либо вниз по подключению к серверу базы данных (обычно базовый выбор какой-то вида). В системах высокого движения это чрезвычайно расточительно, и может добавить значительное напряжение на сервер базы данных.

На месте с низким трафиком, хотя, где ваша база данных может обрабатывать дополнительную нагрузку, вы можете настроить свой DataSource, чтобы сделать JBOSS, подтверждающую соединение, прежде чем передавать его к вашему приложению. Если соединение мертв, jboss удалит его из бассейна и получите новый, поэтому выдержит перезапуск базы данных.

Любое, добавьте это в ваш файл mysql-ds.xml :

<check-valid-connection-sql>select 1 from mytable</check-valid-connection-sql>

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

См. Документация JBOSS Wiki , чтобы увидеть, как изменить эти файлы данных данных.

2
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: