2010-01-23 3 views
4

연결 풀에 여전히 연결이 끊어졌습니다 - 이유가 무엇입니까?데이터베이스 재시작 후 Jboss 데이터 소스 복구

servlet-

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; 
    } 
} 

스프링의 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> 
+0

MySQL을 ds.xml <로컬 TX-소스> OracleDS <연결 URL> JDBC : MySQL은 : // 로컬 호스트 : 3306/스프링 <드라이버 - 클래스> com.mysql.jdbc.Driver spring_test spring_test13 <최소 풀 사이즈> 1 <최대 풀 사이즈> 5 2 Prasanth

답변

2

이것은 연결 풀 사용시 발생하는 일반적인 문제입니다. 응용 프로그램이 풀에서 연결을 빌려 오는 경우 풀 자체가 연결을 "테스트"하여 유효한지 확인하거나 응용 프로그램에 연결을 남겨 두어야합니까?

풀에서 연결을 테스트하는 경우 필연적으로 연결을 데이터베이스 서버 (일반적으로 일종의 기본 SELECT)로 보내야합니다. 트래픽이 많은 시스템에서는 엄청난 낭비이며 데이터베이스 서버에 상당한 스트레스를 줄 수 있습니다.

트래픽이 적은 사이트에서 데이터베이스가 추가로드를 처리 할 수있는 곳에서는 응용 프로그램에 전달하기 전에 JBoss에서 연결의 유효성을 검사하도록 데이터 소스를 구성 할 수 있습니다. 연결이 끊어지면 JBoss는 그것을 풀에서 제거하고 새 것을 가져 오므로 데이터베이스가 다시 시작될 때까지 계속됩니다.

모든 당신의 mysql-ds.xml 파일이 추가

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

당신은 쿼리를 직접 선택이 비싼 일이 아니다 그것은 많은를 실행 할 것이기 때문에, 확인해야합니다.

이러한 데이터 소스 파일을 수정하는 방법은 JBoss documentation wiki을 참조하십시오.

+0

예. Jboss가 연결을 반환하기 전에 무언가를한다는 것을 보는 또 하나의 설정이 있습니다. valid-connection-checker-class-name은 SQL을 발행하는 'better'라고 가정합니다. 애플리케이션이 그 상황을 처리 할 수 ​​있어야한다고 언급했기 때문에, 나는 Hibernate/Spring 프레임 워크가 우리를 위해 그것을하는지 궁금해했다. 닫힌 연결 예외에는 모든 데이터베이스에 대한 표준 코드가 제공됩니다. – Prasanth

+0

아니요, Spring이나 Hibernate 어느 쪽도 더 좋게 처리 할 수 ​​없습니다. 데이터베이스 서버를 다시 시작하려면 연결 검사기를 사용하거나 응용 프로그램 서버를 다시 시작하십시오. 아, 그리고'valid-connection-checker-class-name'도 SQL을 발행합니다. 아무런 차이가 없습니다. – skaffman

+0

@skaffman tns ping을 사용하는 org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker 여기에 언급 http://stackoverflow.com/a/145889/274414 –

7

확인. 다음 사람을 위해 유용 희망 :-)

데이터 소스 구성 설정이 - exception-sorter-class-name

제이 보스에 따르면이이 구성이 org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter로 설정 Oracle 데이터베이스를 사용 a class that looks at vendor specific messages to determine whether sql errors are fatal and thus the connection should be destroyed. If none specified, no errors will be treated as fatal.

경우에 사용이 . 이 클래스에는 치명적인 오류로 간주되어야하는 모든 오류 코드가 있으므로 연결을 삭제해야합니다.

Jboss 4에서 오류 코드 17002 (연결 재설정) & & 17008 (연결이 닫힘)은 포함되지 않습니다. 그들은 Jboss 5에 추가되었습니다. Jboss 4를 사용하고 연결이 복구되지 않는 이유가 궁금하면 누락 된 코드를 추가하십시오.

<validation> 
    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.vendor.OracleValidConnectionChecker"/> 
    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> 
    <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.vendor.OracleStaleConnectionChecker"/> 
    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> 
</validation> 

지금 제이 보스가 당신의 모든 연결을 확인합니다 :

1

여기 제이 보스 7.1 이상 오라클 DB와 연결 validaton 구성입니다.

관련 문제