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

Sự khác biệt giữa cachePrepStmts và useServerPrepStmts trong MySQL JDBC Driver là gì

Đầu tiên, điều quan trọng là phải phân biệt giữa các câu lệnh do máy khách và máy chủ chuẩn bị.

Tuyên bố do Khách hàng chuẩn bị

Các báo cáo do khách hàng chuẩn bị là các báo cáo được chuẩn bị "mô phỏng". Điều này có nghĩa là chuỗi câu lệnh SQL được mã hóa ở phía máy khách và bất kỳ trình giữ chỗ nào được thay thế bằng các giá trị theo nghĩa đen trước khi gửi câu lệnh đến máy chủ để thực thi. Một câu lệnh SQL hoàn chỉnh được gửi đến máy chủ trong mỗi lần thực thi. Bạn có thể sử dụng nhật ký chung để điều tra cách hoạt động của điều này. ví dụ:

mã sau:

ps=conn.prepareStatement("select ?")
ps.setInt(1, 42)
ps.executeQuery()
ps.setInt(1, 43)
ps.executeQuery()

sẽ hiển thị trong nhật ký:

255 Query  select 42
255 Query  select 43

"Truy vấn" chỉ ra rằng, ở cấp độ giao thức, một COM_QUERY lệnh được gửi với chuỗi câu lệnh sau.

Tuyên bố do máy chủ chuẩn bị

Các câu lệnh do máy chủ chuẩn bị là các câu lệnh được chuẩn bị "đúng" nghĩa là văn bản truy vấn được gửi đến máy chủ, được phân tích cú pháp, trình giữ chỗ và thông tin kết quả được trả lại cho máy khách. Đây là những gì bạn nhận được khi đặt useServerPrepStmts=true . Chuỗi câu lệnh chỉ được gửi đến máy chủ một lần với COM_STMT_PREPARE cuộc gọi (theo tài liệu tại đây ). Mỗi lần thực thi được thực hiện bằng cách gửi một COM_STMT_EXECUTE với xử lý câu lệnh đã chuẩn bị và các giá trị chữ để thay thế cho trình giữ chỗ.

Để đối chiếu với ví dụ do máy khách chuẩn bị, chúng ta có thể sử dụng một khối mã tương tự (nhưng lần này có bật các câu lệnh do máy chủ chuẩn bị):

ps2=conn2.prepareStatement("select ?")
ps2.setInt(1, 42)
ps2.executeQuery()
ps2.setInt(1, 43)
ps2.executeQuery()

Và nhật ký sẽ hiển thị:

254 Prepare    select ?
254 Execute    select 42
254 Execute    select 43

Bạn có thể thấy rằng câu lệnh được chuẩn bị trước khi được thực thi. Nhật ký đang giúp đỡ chúng tôi và hiển thị câu lệnh đầy đủ cho việc thực thi nhưng trên thực tế, chỉ các giá trị giữ chỗ được gửi từ máy khách đến máy chủ cho mỗi lần thực thi.

Các câu lệnh chuẩn bị vào bộ nhớ đệm

Nhiều nhóm kết nối sẽ lưu vào bộ nhớ cache các câu lệnh đã chuẩn bị trước khi sử dụng một kết nối có nghĩa là nếu bạn gọi conn.prepareStatement("select ?") , nó sẽ trả về cùng một PreparedStatement ví dụ về các cuộc gọi liên tiếp với cùng một chuỗi câu lệnh. Điều này hữu ích để tránh chuẩn bị lặp lại cùng một chuỗi trên máy chủ khi các kết nối được trả về nhóm giữa các giao dịch.

Tùy chọn MySQL JDBC cachePrepStmts sẽ lưu vào bộ nhớ cache các câu lệnh được chuẩn bị theo cách này (cả câu lệnh được chuẩn bị từ máy khách và máy chủ) cũng như lưu vào bộ nhớ cache "khả năng chuẩn bị" của một câu lệnh. Có một số câu lệnh trong MySQL không thể chuẩn bị trước ở phía máy chủ. Trình điều khiển sẽ cố gắng chuẩn bị một tuyên bố trên máy chủ nếu nó tin rằng nó có thể thực hiện được và, nếu việc chuẩn bị không thành công, hãy quay lại với một tuyên bố do khách hàng chuẩn bị. Việc kiểm tra này rất tốn kém do yêu cầu một chuyến đi khứ hồi đến máy chủ. Tùy chọn này cũng sẽ lưu vào bộ nhớ cache kết quả của việc kiểm tra này.

Hy vọng điều này sẽ hữu ích.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySqlParameter dưới dạng TableName

  2. Cách lấy Ngày từ một Kết quả

  3. Kết quả thời gian truy vấn trong MySQL w / PHP

  4. Truyền tên bảng làm tham số của câu lệnh đã chuẩn bị

  5. Làm thế nào để chuyển đổi epoch sang mySQL timestamp trong JAVA