Oracle JDBC Optimization : 스프링 부트 애플리케이션에서 PreparedStatement 캐싱 사용


9

Oracle 데이터베이스에 연결된 Spring Boot REST 응용 프로그램이 있습니다. JdbcTemplate을 사용하여 JDBC를 사용하고 있습니다. Oracle 데이터베이스 특성은 다음 3 가지 application.properties 설정을 통해 얻습니다 .

spring.datasource.url
spring.datasource.username
spring.datasource.password

이 응용 프로그램은 HikariCP를 사용하고 있습니다. HikariCP 웹 사이트에서 JDBC 드라이버가 최상의 설정이므로이 풀이 PreparedStatements를 캐시하지 않는다는 것을 알게되었습니다.

이제, 이것을 보장하기 위해 어디에서 무엇을 지정 하시겠습니까?

  1. Oracle JDBC Driver (ojdbc7.jar)가 PreparedStatements를 캐시합니다. 캐시 할 수있는 PreparedStatements 수를 사용자 정의하는 방법이 있습니까?

  2. 에서 https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , 우리는 볼

    데이터베이스가 최대 패킷 크기로 설정되어 있고 드라이버가 해당 패킷 크기와 일치하는지 확인하십시오. 더 큰 결과 집합을 가져 오기 위해 드라이버와 서버간에 전송 / 수신 된 총 패킷 수를 줄입니다.

위의 내용을 준수하기 위해 필요한 단계는 무엇입니까?

  1. Oracle DB Server 패킷 크기 찾기
  2. Oracle DB Server가 최대 패킷 크기로 설정되어 있는지 확인
  3. Oracle JDBC 드라이버 (ojdbc8.jar) 패킷 크기 설정을 찾으십시오.

다른 (Oracle) JDBC 성능 최적화 팁을 주시면 감사하겠습니다.


dba 사이트에 문의하는 것이 더 적합합니까? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 실제로는 이것이 JDBC 드라이버 구성에 관한 것이기 때문에 (이러한 구성 옵션이 있다고 가정 할 경우) DBA 질문이 아니라 프로그래밍 질문이됩니다.
Mark Rotteveel

답변:


2

안녕, 준비된 명령문 캐싱 사용 함수는 Spring 과도, REST 와도 관련이 없습니다. 이 함수는 데이터 소스, JDBC 드라이버 및 데이터베이스 간의 협상 문제입니다. 설정 방법을 알아 보려면 드라이버, 데이터 소스 및 데이터베이스에 대한 관련 문서를 읽으십시오.

Hikari와 관련 하여이 작업을 수행하는 확실한 방법은 다음과 같습니다 (notice datasource2 , 자동 구성을 사용 하도록 데이터 소스 로 이름 바꾸기 ).

spring:
  datasource2:
      dataSourceClassName: com.zaxxer.hikari.HikariDatasource
       .....
       ......
      configuration:
            maximumPoolSize: 25  
            data-source-properties:
               ImplicitCachingEnabled: true
               MaxStatements: 100

구성 내부의 속성은 기본 드라이버로 바로 전달됩니다.

@Bean
@ConfigurationProperties("spring.datasource2")
public DataSourceProperties dataSourceProperties2() {
    return new DataSourceProperties();
}

@Bean()
@ConfigurationProperties("spring.datasource2.configuration")
public DataSource hikariDatasource() {


    return dataSourceProperties2().initializeDataSourceBuilder().build();

}

이 예제는 기본 데이터 소스의 수동 초기화를 사용합니다.


이것은 MySQL의 설정입니다, cachePrepStmtsMySQL의 JDBC 드라이버 옵션을 볼 수 있습니다 github.com/brettwooldridge/HikariCP/blob/...dev.mysql.com/doc/connector-j/5.1/en/...
카롤 Dowbecki

@KarolDowbecki는 actualy thgis 예 : DB2에서 실행되었다
Alexandar 페트로프

Point는 data-source-properties프록시이며 속성을 드라이버에 전달하므로 드라이버에 cachePrepStmts속성이 없으면 작동하지 않습니다. ojdbc8 드라이버에는이 속성이 없습니다.
Karol Dowbecki

@KarolDowbecki는 스프링 부트 REST와 기타를 포함하는 대신 질문을 "Oracle에서 명령문 캐싱을 활성화하기 위해 필요한 속성"으로 변경해야 할 수도 있습니다. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov

@AlexandarPetrov : 안녕하세요, 저는 OP입니다. REST 부분을 제거했습니다. 나는 ojdbc7.jar 사용하여 Oracle 11/12에 대한 구성 등록 정보를 필요로
anjanb

0
  • 를 통한 명령문 캐싱 사용

oracleDataSource.setImplicitCachingEnabled(true)

  • 메모리를 최대한 활용하기 위해 올바른 캐시 크기를 선택하십시오

connection.setStatementCacheSize(10) 가장 많이 사용되는 명령문 수에 더 가깝게 노력하십시오. 기본 명령문 캐시 크기는 10입니다.

  • 명령문 캐싱을 사용하도록 애플리케이션을 변경할 수없는 경우 폴백

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


OracleDatasource에 액세스 할 수 없습니다. 내가 접근 할 수있는 것은 히카리 데이터 소스를 얻을 JdbcTemplate이다. 또한 연결 수준으로 이동하지 않습니다. JdbcTemplate 수준에서 작업합니다.
anjanb

0

ojdbc8.jar데이터베이스 서버 버전과 일치 하는지 문서를 확인하여 시작하십시오 . ojdbc8.jar11g, 11gR2, 12c 에는 다른 버전이 있습니다 .

이 답변 , 당신은 필요 oracle.jdbc.implicitStatementCacheSizeJDBC 드라이버에서 설정 할 속성을. 이 문서에서는 몇 가지 더 JDBC 드라이버 속성이 예 언급 oracle.jdbc.freeMemoryOnEnterImplicitCache이나 oracle.jdbc.maxCachedBufferSize. 이러한 속성을 사용할 수 있는지 확인하려면 드라이버 버전에 대한 문서를 확인해야합니다.

Spring Boot HikariCP spring.datasource.hikari.data-source-properties옵션을 사용하여 전달할 수 있습니다 . Spring Boot 버전에 대한 문서를 다시 확인하십시오.이 속성은 적어도 한 번 이름이 바뀌 었습니다.

application.yaml

spring:
  datasource:
    hikari:
      data-source-properties:
        oracle.jdbc.implicitStatementCacheSize: 100  

application.properties

spring.datasource.hikari.data-source-properties.oracle.jdbc.implicitStatementCacheSize: 100 

명령문 페치 크기에 관심이있을 수 있지만이 최적화는 일반적으로 각 명령문에 개별적으로 적용됩니다.


안녕하세요 @Karol, 감사합니다. application.yml 파일 대신 application.properties 파일을 사용하여 이러한 속성을 어떻게 바꾸나요?
anjanb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.