Tối ưu hóa JDBC của Oracle: Kích hoạt bộ đệm ẩn PreparedStatement trong ứng dụng khởi động Spring


9

Tôi có một ứng dụng Spring Boot REST được kết nối với cơ sở dữ liệu Oracle. Chúng tôi đang sử dụng JDBC bằng JdbcTemplate. Các thuộc tính cơ sở dữ liệu Oracle có được thông qua 3 cài đặt application.properations này :

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

Ứng dụng này đang sử dụng HikariCP. Từ trang web HikariCP, tôi biết rằng nhóm này không lưu trữ PreparedStatements vì trình điều khiển JDBC là thiết lập tốt nhất để làm điều đó.

Bây giờ, ở đâu và những gì tôi sẽ chỉ định để đảm bảo những điều này:

  1. Trình điều khiển Oracle JDBC (ojdbc7.jar) lưu trữ PreparedStatements. Có cách nào để tùy chỉnh số lượng PreparedStatements mà nó có thể lưu trữ.

  2. Từ https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , chúng tôi thấy rằng

    Đảm bảo rằng cơ sở dữ liệu của bạn được đặt ở kích thước gói tối đa và trình điều khiển khớp với kích thước gói đó. Để tìm nạp các tập kết quả lớn hơn, điều này làm giảm số lượng tổng số gói được gửi / nhận giữa trình điều khiển và máy chủ.

Để thực hiện những điều trên, các bước cần thiết để

  1. tìm kích thước gói máy chủ Oracle DB
  2. tìm xem máy chủ Oracle DB được đặt ở kích thước gói tối đa
  3. tìm đặt kích thước gói của trình điều khiển Oracle JDBC (ojdbc8.jar).

Bất kỳ mẹo tối ưu hóa hiệu suất JDBC (Oracle) nào khác sẽ được đánh giá cao.


Có phù hợp hơn để hỏi trong trang web dba? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Không thực sự, bởi vì đây là về cách định cấu hình trình điều khiển JDBC (giả sử nó thậm chí có tùy chọn cấu hình như vậy), điều này làm cho câu hỏi này lập trình chứ không phải câu hỏi DBA.
Mark Rotteveel

Câu trả lời:


2

Xin chào chức năng Kích hoạt bộ đệm ẩn câu lệnh Chuẩn bị không có gì để làm cả với Spring, cũng không phải với REST. Hàm này là một câu hỏi chỉ thương lượng giữa nguồn dữ liệu, trình điều khiển JDBC và cơ sở dữ liệu của bạn. Để tìm hiểu cách thiết lập, hãy đọc tài liệu liên quan về trình điều khiển, nguồn dữ liệu và cơ sở dữ liệu của bạn.

Khi nói đến Hikari, cách coirrect để làm điều này là (thông báo datasource2 , đổi tên để nguồn dữ liệu để cho phép tự động cấu hình):

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

Các thuộc tính bên trong cấu hình của bạn sẽ được chuyển thẳng đến trình điều khiển bên dưới.

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

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


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

}

Ví dụ này sử dụng khởi tạo thủ công nguồn dữ liệu cơ bản.


Đây là cấu hình MySQL, cachePrepStmtslà một tùy chọn trình điều khiển JDBC của MySQL, xem github.com/brettwooldridge/HikariCP/blob/ , và dev.mysql.com/doc/connector-j/5.1/en/ trộm
Karol Dowbecki

Ví dụ @KarolDowbecki trên thực tế Junis đang chạy trên DB2 :)
Alexandar Petrov

Điểm là data-source-propertiesmột proxy, nó chuyển các thuộc tính cho trình điều khiển vì vậy nếu trình điều khiển không có cachePrepStmtstài sản thì nó sẽ không hoạt động. Trình điều khiển ojdbc8 không có thuộc tính này.
Karol

@KarolDowbecki có lẽ bạn nên thay đổi câu hỏi thành "Bạn cần thuộc tính nào để kích hoạt bộ đệm ẩn câu lệnh trong Oracle" thay vì liên quan đến khởi động REST mùa xuân và bất cứ điều gì. docs.oracle.com/cd/B19306_01/java.102/b14355/iêu
Alexandar Petrov

@AlexandarPetrov: Xin chào, tôi là OP ở đây. Tôi đã loại bỏ phần REST. Tôi cần các thuộc tính cấu hình cho Oracle 11/12 bằng cách sử dụng ojdbc7.jar
anjanb

0
  • Cho phép bộ đệm ẩn tuyên bố thông qua

oracleDataSource.setImplicitCachingEnabled(true)

  • Chọn kích thước bộ đệm phù hợp để sử dụng tốt nhất bộ nhớ

connection.setStatementCacheSize(10) Cố gắng gần hơn với số lượng câu lệnh được sử dụng nhiều nhất Kích thước bộ đệm của câu lệnh mặc định là 10

  • Dự phòng nếu bạn không thể thay đổi ứng dụng để sử dụng bộ đệm ẩn câu lệnh

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


Tôi không có quyền truy cập vào OracleDatasource. Tất cả những gì tôi có quyền truy cập là JdbcTemplate từ đó tôi sẽ nhận được nguồn dữ liệu Hikari. Tôi cũng không đi đến cấp độ kết nối - Tôi làm việc ở cấp độ JdbcTemplate.
anjanb

0

Bắt đầu bằng cách kiểm tra tài liệu để đảm bảo rằng bạn ojdbc8.jarphù hợp với phiên bản máy chủ cơ sở dữ liệu. Có các phiên bản khác nhau ojdbc8.jarcho 11g, 11gR2, 12c.

Theo câu trả lời này , bạn cần oracle.jdbc.implicitStatementCacheSizeđặt thuộc tính trong trình điều khiển JDBC. Bài viết này đề cập thêm vài thuộc tính trình điều khiển JDBC, ví dụ oracle.jdbc.freeMemoryOnEnterImplicitCachehoặc oracle.jdbc.maxCachedBufferSize. Bạn cần kiểm tra tài liệu cho phiên bản trình điều khiển của bạn để xác nhận rằng các thuộc tính này có sẵn.

Điều này có thể được thông qua bằng Spring Boot HikariCP spring.datasource.hikari.data-source-properties tùy chọn . Kiểm tra kỹ tài liệu cho phiên bản Spring Boot của bạn, thuộc tính này đã được đổi tên ít nhất một lần:

ứng dụng.yaml

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

ứng dụng

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

Bạn cũng có thể quan tâm đến kích thước tìm nạp câu lệnh nhưng tối ưu hóa này thường được áp dụng cho từng câu lệnh riêng biệt.


Xin chào @Karol, cảm ơn. Làm cách nào để tôi viết lại các thuộc tính này bằng tệp application.properIES thay vì tệp application.yml?
anjanb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.