2014-11-19 5 views
3

Windows Server 2008 R2에서 실행되는 Apache Tomcat 7.0.54에서 실행되는 JSF2.0 웹 서버가 있습니다. 우리는이 컴퓨터에서 실행중인 SQL 서버와 인벤토리 소프트웨어를 호스팅하는 SQL 서버를 가지고 있습니다. 우리 웹 페이지의 한 부분은 PartNumbers가 추가되었는지 확인하는 것입니다. 이 연결 풀은 SQL 서버와 통신 할 때 가장 좋은 방법이라고 읽은 후에 인벤토리 소프트웨어에 대한 유효성 검사를 위해 사용했습니다.연결 풀이 닫히는 이유는 무엇입니까?

연결 풀의 상태를 확인할 수있는 방법을 원했기 때문에 2 개의 유효한 올바른 부품 번호를 확인하는 ViewScoped 백업 빈을 사용하여 테스트 페이지를 만들었습니다. 이번 주에 두 번째로 이번 주에 "Connection is closed"라는 오류 메시지가 나타납니다. 저는 회의장 수영장을 처음 사용하고 있으며 이에 관한 정보를 찾을 수없는 것 같습니다. 우리가 제대로 설정하지 않은 것에 대해 당황 스럽습니다. 이제 아파치 서버를 리셋하고 백업하고 실행 중입니다. 그래서 .. 연결 풀을 생성하기 위해 앱의 META-INF/context.xml에 코드를 추가했습니다.

<Resource type="javax.sql.DataSource" 
     name="jdbc/FOODB" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
     url="jdbc:sqlserver://Foobar\Inventory;databaseName=FooInventory;user=johnDoe;password=astrongpassword;" 
    /> 

ConnectionPool을 사용해야하는 기본 개념은 SqlAccessCommand라는 인터페이스가 있다는 것입니다. 그것은 다소 어댑터 패턴입니다. 내 테스트 페이지에서 오류 메시지를 표시 할 수 있도록 RunUnsafe 메서드를 사용합니다. 그래서 RunUnsafe 메소드가 있습니다.

내가 알기로는 사용 후 연결을 닫아야하는 리소스를 사용해보십시오. try/catch/finally와 거의 같지만, 그냥 청소기 (IMO). 그래서 내 연결이 열려있을 때 이것은 잘 작동합니다. 지금까지 2x 이제는 서버를 다시 시작해야했습니다. (내가 다른 방법으로 연결을 다시 여는 방법을 모르기 때문에) 무엇이 누락 되었습니까? 퍼즐의 더 많은 부분이 필요한 경우 나에게 의견을 남기고 내가 할 수있는 것을 게시 할 것입니다. 고맙습니다.

편집

는 로그 파일에보고 오늘 아침

com.microsoft.sqlserver.jdbc.SQLServerException 발생이 예외가 있었다 : 피어 연결 재설정 : 소켓 쓰기 오류

의견에 따르면 지금까지는 타임 아웃으로 간주되었습니다. 이 오류 메시지가 여전히 그 방향을 가리 킵니까? 피어에 의해 연결 재설정 :

+2

비활성 상태가 된 후 연결 시간이 초과되었을 수 있습니다. –

+0

@ElliottFrisch는 연결을 끊지 않는 경우가 아닙니까? 그렇다면 자원으로 시도하는 것이 무엇을위한 것이 아닌가? –

+1

풀을 사용할 때 연결이 '닫히지 않습니다'(d). 그들은 수영장으로 돌아 간다. 결국 (연결을 충분히 사용하지 않을 경우) 데이터베이스는 연결이 잘못되었다고 간주하고 닫습니다. 솔루션에 대한 풀 구성 옵션을 조사해야합니다. –

답변

5

당신은 연결이 여전히 유효한지 검출하기 위해 연결 풀 구성에서 일부 옵션 1를 추가해야합니다.

가장 간단한 방법은 간단한 SQL 문 을 실행하여 연결을 테스트하는 것입니다.

그래서 풀 구성은 다음과 같습니다

<Resource type="javax.sql.DataSource" 
      name="jdbc/FOODB" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
      url="jdbc:sqlserver://Foobar\Inventory;databaseName=FooInventory;user=johnDoe;password=astrongpassword;" 
      validationQuery="SELECT 1" 
      validationQueryTimeout="1000" 
      testOnBorrow="true" 
/> 

노트

  1. 가능한 옵션을 보려면 다음 The Tomcat JDBC Connection Pool
  2. Efficient SQL test query or validation query that will work across all (or most) databases
  3. 을3210
+2

이 옵션 목록을 찾아 주셔서 감사합니다. 나는 같은 문서에있는 버려진 제거 작업과 함께 갈 것이지만 이것은 더 논리적 인 것으로 보인다. –

+0

이 답변에 실제로 해결책이 있기 때문에 수정하십시오. –

+0

이 솔루션은 모든 쿼리에서 'Connection'의 유효성을 검사하는 데 드는 비용이 발생합니다. (슬프게도) 마법의 탄환이 없습니다. –

3

귀하의 연결이 거의 확실 com.microsoft.sqlserver.jdbc.SQLServerException의 로그 메시지를 기반으로, 비 활동으로 인해 시간이 초과되는 소켓 쓰기 오류 당신은 말한다,이 Technet 메모를 읽을 수

연결이 피어에 의해 강제로 닫혔습니다. 이 오류는 일반적으로 시간 초과 또는 다시 시작으로 인해 원격 소켓에서 연결이 끊어지면 발생합니다.

0

포기 구성 옵션을 사용하는 것이 좋습니다.

+1

'removeAbandoned'는 ** 응용 프로그램 **이 연결을 제대로 닫지 않을 때 유용 할 수 있습니다. 그러나 OP의 문제는 연결이 ** 데이터베이스 **에 의해 닫혀 있다는 것입니다. –

관련 문제