PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chèn chậm trên PostgreSQL bằng JDBC

Có vẻ như đây là sự kết hợp giữa "lỗi" Spring và "lỗi" trình điều khiển.

Spring cố gắng xác định kiểu dữ liệu của cột mỗi lần setValue() được gọi là. Nó thực hiện điều này bằng cách gọi PreparedStatementMetaData.getParameterMetaData()

Điều này dường như khiến một câu lệnh "chuẩn bị" được gửi đến cơ sở dữ liệu, bản thân nó khá nhanh (không bao giờ quá 1ms trên máy tính xách tay của tôi) nhưng khi nó được gọi cho mỗi cột đối với mỗi hàng, điều này tổng cộng rất nhiều thời gian (nó được gọi cho mọi giá trị không phải null, dẫn đến khoảng 23.000 cuộc gọi)

Ở một mức độ nào đó, đây là lỗi của Spring sau đó là lỗi của trình điều khiển vì không lưu vào bộ nhớ đệm dữ liệu meta tham số không thực sự có ý nghĩa (ít nhất là theo ý kiến ​​của tôi). Trình điều khiển MySQL JDBC không hỗ trợ getParameterMetaData() và Spring biết điều này và vì vậy "lỗi" này không hiển thị với MySQL bởi vì spring không bao giờ gọi phương thức đó.

Tôi không chắc liệu hành vi của trình điều khiển JDBC của Postgres có thể được phân loại là lỗi hay không, nhưng chắc chắn sẽ rất tuyệt nếu trình điều khiển lưu vào bộ đệm dữ liệu meta đó sau lần gọi đầu tiên.

Spring có thể được thuyết phục để không lấy dữ liệu meta câu lệnh thông qua thuộc tính spring.jdbc.getParameterType.ignore

Vì vậy, bằng cách đặt:

System.setProperty("spring.jdbc.getParameterType.ignore", "true");

trước đây dòng:

LetsGo letsGo = new LetsGo();

hành vi này đã bị vô hiệu hóa.

Thuộc tính phải được đặt trước Spring được khởi tạo.

Khi tôi làm điều đó với dự án mẫu của bạn, bộ chèn sẽ chạy trong 500ms trên máy tính xách tay của tôi.

Chỉnh sửa

Sau khi xem nhận xét về việc sử dụng trình điều khiển Postgres-NG, tôi đã tìm hiểu các nguồn của trình điều khiển "chính thức" và trình điều khiển NG và trình điều khiển NG lưu vào bộ nhớ cache dữ liệu meta tham số sau lần gọi đầu tiên trong khi trình điều khiển chính thức thì không. giải thích lý do tại sao sử dụng trình điều khiển NG nhanh hơn rất nhiều (mà không cần tắt cuộc gọi trong Spring)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql tìm tổng dung lượng đĩa được cơ sở dữ liệu sử dụng

  2. Triển khai thiết lập đa trung tâm dữ liệu cho PostgreSQL - Phần một

  3. Cách cấp tất cả các đặc quyền về chế độ xem cho người dùng tùy ý

  4. Làm cách nào để chạy ứng dụng python và postgres trong một vùng chứa docker?

  5. Chuyển đổi cột gấu trúc sang danh sách PostgreSQL?