2018년 8월 9일 목요일

[TechInfo] QueryTimeout 구성

QueryTimeout 구성 (webSphereDefaultQueryTimeout)


지정된 시간(초) 이전에 실행이 완료되지 못하면 SQL(Structured Query Language)문이 인터럽트되도록 애플리케이션의 데이터 소스에 조회 제한시간을 구성할 수 있습니다. 

시작하기 전에

JDBC(Java Database Connectivity) API는 표준 인터페이스 java.sql.Statement.setQueryTimeout을 제공하여 명령문이 실행될 때까지 JDBC 드라이버가 대기하는 시간(초)을 제한합니다. 애플리케이션이 이 시간을 사용하여 요청이 인터럽트되기 전에 SQL문이 완료될 때까지 애플리케이션이 대기하는 최대 시간을 제어합니다. WebSphere® Application Server는 java.sql.Statement.setQueryTimeout을 직접 호출하도록 애플리케이션을 변경할 필요 없이 데이터 소스에서 조회 제한시간을 설정합니다. 모든 명령문에서 java.sql.Statement.setQueryTimeout 인터페이스를 호출하여 애플리케이션에서 SQL 조회 제한시간을 여전히 프로그래밍 방식으로 설정할 수 있습니다.

이 태스크 정보

다음 사용자 정의 특성 중 하나를 사용하여 이 조회 제한시간을 구성할 수 있습니다.
  1. webSphereDefaultQueryTimeout은 제한시간이 초과하기 전에 SQL문이 실행할 수 있는 시간(초)인 기본 조회 제한시간을 설정합니다. 이 기본값은syncQueryTimeoutWithTransactionTimeout 사용자 정의 특성이 사용된 경우 JTA(Java Transaction API) 트랜잭션 중에 대체됩니다. 
  2. syncQueryTimeoutWithTransactionTimeout은 SQL문의 기본 조회 제한시간으로 JTA 트랜잭션에 남아 있는(있는 경우) 시간을 사용합니다. 
기본적으로 조회 제한시간은 사용 불가능합니다. 두 개의 데이터 소스 사용자 정의 특성이 있는지 여부 및 해당 값에 따라 제한시간 값은 다음으로 산출됩니다.
  • TM(Transaction Manager) 제한시간 설정을 기반으로 현재 JTA 트랜잭션에 남아 있는 시간 - syncQueryTimeoutWithTransactionTimeout
  • 구성에 지정된 절대 시간(초) - webSphereDefaultQueryTimeout
그런 다음 산출된 제한시간은 구성된 데이터 소스를 사용하여 애플리케이션이 실행한 각 SQL문에서 조회 제한시간 값을 설정하는 데 사용됩니다.

프로시저

  1. 관리 콘솔을 여십시오.
  2. 데이터 소스의 WebSphere Application Server 데이터 소스 특성 패널로 이동하십시오.
    1. 자원 > JDBC > 데이터 소스 > data_source를 클릭하십시오. 
    2. WebSphere Application Server 데이터 소스 특성을 클릭하십시오.
  3. 추가 특성 아래에서 사용자 정의 특성을 클릭하십시오.
  4. 새로 작성을 클릭하십시오.
  5. 이름 필드에 webSphereDefaultQueryTimeout을 입력하십시오.
  6.  필드에 기본 조회 제한시간으로 사용할 시간(초)을 입력하십시오. 제한시간 값은 초 단위입니다. 값 0은 제한시간이 없음을 표시합니다.
  7. 확인을 클릭하십시오.
  8. 새로 작성을 클릭하십시오.
  9. 이름 필드에 syncQueryTimeoutWithTransactionTimeout을 입력하십시오.
  10.  필드에 true 또는 false를 입력하십시오. 값이 true이면 JTA 트랜잭션에 남아 있는 시간을 기본 조회 제한시간으로 사용합니다. 
  11. 확인을 클릭하십시오.
  12. 변경사항을 저장하십시오. 서버가 다시 시작된 후에는 업데이트 사항이 적용됩니다.

결과

애플리케이션의 데이터 소스에서 조회 제한시간을 구성했습니다. 

다음 예는 데이터 소스 사용자 정의 특성 webSphereDefaultQueryTimeout = 20 및 syncQueryTimeoutWithTransactionTimeout = true를 설정한 영향을 설명합니다. 두 특성을 모두 설정했으므로 (transaction.begin() 및 transaction.commit()에 대한 호출로 경계가 구분된) JTA 트랜잭션 외부에서 실행된 SQL문은 webSphereDefaultQueryTimeout에 의해 설정된 기본 제한시간 값을 사용합니다. JTA 트랜잭션 내의 항목은 트랜잭션 제한시간이 만료되기 전에 남아 있는 시간을 사용합니다. 
copy to clipboard
다음 예는 데이터 소스 사용자 정의 특성 webSphereDefaultQueryTimeout = 20 및 syncQueryTimeoutWithTransactionTimeout = false를 설정한 영향을 설명합니다. webSphereDefaultQueryTimeout만 설정한 경우, JTA 트랜잭션 내에서 실행되는지 여부에 관계 없이 모든 명령문에 기본 제한시간 값이 사용됩니다. 
copy to clipboard
애플리케이션 코드에서 java.sql.Statement.setQueryTimeout 인터페이스를 호출하여 언제든 명령문의 조회 제한시간을 대체할 수 있습니다. 




Question

Does the Data Server Driver for JDBC have a QueryTimeout property? 

Cause

Unable to find query timeout property for the Data Server Driver for JDBC and SQLJ.

Answer

The Data Server Driver for JDBC and SQLJ does not support a QueryTimeout property. Developers must use the setQueryTimeout method on the java.sql.Statement object. However, the Data Server Driver for Type 4 connectivity does provide a property that will close the connection socket upon a hang or wait condition on socketRead() for a long running query. 

    blockingReadConnectionTimeout specifies the amount of time in seconds before a connection socket read times out. This property affects all requests that are sent to the datasource after a connection is successfully established. The default is 0, which means that there is no timeout.


Configure this property in the server.properties file:
Read timeout while reading from the socket. Timeout is in milliseconds.
If you are using Oracle data sources and are experiencing frequent timeouts, you can increase the value of this option by adding an entry to the server.properties file.
The default value is 600000 milliseconds.
oracle.jdbc.ReadTimeout=milliseconds
oracle.jdbc.ReadTimeout=900000

댓글 없음:

댓글 쓰기