libpqcách đọc kèo bóng đá cho phép các ứng dụng gửi truy vấn mà không phải đọc kết quả của truy vấn đã gửi trước đó. Tận dụng cách đọc kèo bóng đá, máy khách sẽ chờ máy chủ ít hơn, vì nhiều truy vấn/kết quả có thể được gửi/nhận trong một giao dịch mạng.
Trong khi cách đọc kèo bóng đá cung cấp một sự tăng hiệu suất đáng kể, việc viết khách hàng bằng cách đọc kèo bóng đá phức tạp hơn vì nó liên quan đến việc quản lý hàng đợi các truy vấn đang chờ xử lý và tìm kết quả tương ứng với truy vấn nào trong hàng đợi.
cách đọc kèo bóng đá cũng thường tiêu thụ nhiều bộ nhớ hơn trên cả máy khách và máy chủ, mặc dù quản lý cẩn thận và tích cực của hàng đợi gửi/nhận có thể giảm thiểu điều này. Điều này áp dụng liệu kết nối có ở chế độ chặn hay không chặn hay không.
trong khilibpq8454_8490PostgreSQL14, Đây là một tính năng phía máy khách cách đọc kèo bóng đá yêu cầu hỗ trợ máy chủ đặc biệt và hoạt động trên bất kỳ máy chủ nào hỗ trợ giao thức truy vấn mở rộng V3. Để biết thêm thông tin, xemPhần 55.2.4.
Để phát hành các đường ống, ứng dụng phải chuyển kết nối sang cách đọc kèo bóng đá, được thực hiện vớipqenterpipelinemode
. pqpipelinestatus
có thể được sử dụng để kiểm tra xem cách đọc kèo bóng đá có hoạt động hay không. Trong cách đọc kèo bóng đá, chỉPostgresql: Tài liệu: 16: 34.4. Sử dụng giao thức truy vấn mở rộng được cho phép, các chuỗi lệnh chứa nhiều lệnh SQL cách đọc kèo bóng đá được phép, và cũng vậysao chép
. Sử dụng các chức năng thực thi lệnh đồng bộ nhưPQFN
, PQEXEC
, PQExecParams
, PQPrepare
, PQEXECPREPARED
, ,
, là một điều kiện lỗi.
PQSendQuery
cũng không được phép, vì nó sử dụng giao thức truy vấn đơn giản. Khi tất cả các lệnh được gửi đã xử lý cách đọc kèo bóng đá quả của họ và cách đọc kèo bóng đá quả đường ống cuối đã được tiêu thụ, ứng dụng có thể trở lại chế độ không có mục tiêu vớiPQEXITPIPELINEMODE
.
Tốt nhất là sử dụng cách đọc kèo bóng đá vớilibpqinChế độ cách đọc kèo bóng đá chặn. Nếu được sử dụng trong chế độ chặn, có thể xảy ra bế tắc máy khách/máy chủ.[15]
Sau khi vào cách đọc kèo bóng đá, ứng dụng gửi các yêu cầu bằng cách sử dụngPQSendQueryParams
hoặc anh chị em đã chuẩn bị của nóPQSendQueryPrepared
. Các yêu cầu này được xếp hàng ở phía máy khách cho đến khi được chuyển đến máy chủ; Điều này xảy ra khipqpipelinesync
được sử dụng để thiết lập một điểm đồng bộ hóa trong đường ống hoặc khipqflush
được gọi. Các chức năngPQSendPrepare
, và
Cũng hoạt động ở cách đọc kèo bóng đá. Xử lý kết quả được mô tả bên dưới.
Máy chủ thực thi các câu lệnh và trả về cách đọc kèo bóng đá quả, theo thứ tự mà máy khách gửi cho họ. Máy chủ sẽ bắt đầu thực thi các lệnh trong đường ống ngay lập tức, không chờ cách đọc kèo bóng đá thúc đường ống. Lưu ý rằng cách đọc kèo bóng đá quả được đệm ở phía máy chủ; Máy chủ xả bộ đệm đó khi điểm đồng bộ hóa được thiết lập vớiPQPipelinesync
hoặc khiPQSendFlushRequest
được gọi. Nếu bất kỳ câu lệnh nào gặp phải lỗi, máy chủ sẽ hủy bỏ giao dịch hiện tại và cách đọc kèo bóng đá thực hiện bất kỳ lệnh tiếp theo nào trong hàng đợi cho đến điểm đồng bộ hóa tiếp theo; MộtPGRES_PIPELINE_ABORTED
cách đọc kèo bóng đá quả được tạo ra cho mỗi lệnh như vậy. (Điều này vẫn đúng ngay cả khi các lệnh trong đường ống sẽ cuộn lại giao dịch.) Xử lý truy vấn tiếp tục sau điểm đồng bộ hóa.
Tốt cho một thao tác phụ thuộc vào cách đọc kèo bóng đá quả của một hoạt động trước đó; Ví dụ, một truy vấn có thể xác định một bảng mà truy vấn tiếp theo trong cùng một đường ống sử dụng. Tương tự, một ứng dụng có thể tạo ra một câu lệnh đã chuẩn bị và thực hiện nó với các câu lệnh sau trong cùng một đường ống.
Để xử lý cách đọc kèo bóng đá quả của một truy vấn trong đường ống, ứng dụng gọiPQGetResult
Liên tục và xử lý từng cách đọc kèo bóng đá quả cho đến khiPQGetResult
Trả về null. cách đọc kèo bóng đá quả từ truy vấn tiếp theo trong đường ống sau đó có thể được truy xuất bằng cách sử dụngPQGetResult
Một lần nữa và chu kỳ lặp lại. Ứng dụng xử lý cách đọc kèo bóng đá quả tuyên bố cá nhân là bình thường. Khi cách đọc kèo bóng đá quả của tất cả các truy vấn trong đường ống đã được trả về,PQGetResult
Trả về cách đọc kèo bóng đá quả chứa giá trị trạng tháiPGRES_PIPELINE_SYNC
Khách hàng có thể chọn trì hoãn xử lý cách đọc kèo bóng đá quả cho đến khi đường ống hoàn chỉnh được gửi hoặc xen kẽ rằng với việc gửi thêm các truy vấn trong đường ống; nhìn thấyPhần 34.5.1.4.
Để vào chế độ hàng đơn, gọiPQSetSinglerowMode
Trước khi lấy cách đọc kèo bóng đá quả vớiPQGetResult
. Lựa chọn chế độ này chỉ có hiệu quả cho truy vấn hiện đang được xử lý. Để biết thêm thông tin về việc sử dụngPQSetSinglerowMode
, Tham khảoPhần 34.6.
PQGetResult
hoạt động gicách đọc kèo bóng đá như đối với xử lý không đồng bộ bình thường ngoại trừ nó có thể chứa mới mớipgresult
loạipgres_pipeline_sync
vàPGRES_PIPELINE_ABORTED
. PGRES_PIPELINE_SYNC
được báo cáo chính xác một lần cho mỗipqpipelinesync
Tại điểm tương ứng trong đường ống.PGRES_PIPELINE_ABORTED
được phát ra thay cho cách đọc kèo bóng đá quả truy vấn thông thường cho lỗi đầu tiên và tất cả các cách đọc kèo bóng đá quả tiếp theo cho đến khi tiếp theopgres_pipeline_sync
; nhìn thấyPhần 34.5.1.3.
pqisbusy
, PQConsumeInput
, vv hoạt động như bình thường khi xử lý cách đọc kèo bóng đá quả đường ống. Cụ thể, một cuộc gọi đếnpqisbusy
Ở giữa đường ống trả về 0 nếu cách đọc kèo bóng đá quả cho tất cả các truy vấn được phát hành cho đến nay đã được tiêu thụ.
libpqcách đọc kèo bóng đá cung cấp bất kỳ thông tin nào cho ứng dụng về truy vấn hiện đang được xử lý (ngoại trừPQGetResult
Trả về null để cho biết rằng chúng tôi bắt đầu trả về cách đọc kèo bóng đá quả của truy vấn tiếp theo). Ứng dụng phải theo dõi thứ tự mà nó đã gửi truy vấn, liên cách đọc kèo bóng đá chúng với cách đọc kèo bóng đá quả tương ứng của chúng. Các ứng dụng thường sẽ sử dụng máy trạng thái hoặc hàng đợi FIFO cho việc này.
Từ quan điểm của khách hàng, sauPQResultstatus
returnPGRES_FATAL_ERROR
, đường ống được gắn cờ là bị hủy bỏ.PQResultstatus
sẽ báo cáo APGRES_PIPELINE_ABORTED
cách đọc kèo bóng đá quả cho mỗi hoạt động xếp hàng còn lại trong một đường ống bị hủy bỏ. cách đọc kèo bóng đá quả chopqpipelinesync
được báo cáo làPGRES_PIPELINE_SYNC
Để báo hiệu sự cách đọc kèo bóng đá thúc của đường ống bị hủy bỏ và nối lại xử lý cách đọc kèo bóng đá quả thông thường.
Máy kháchphảicách đọc kèo bóng đá quả xử lý vớiPQGetResult
Trong quá trình phục hồi lỗi.
Nếu đường ống sử dụng một giao dịch ngầm, thì các hoạt động đã được thực thi sẽ được quay lại và các hoạt động được xếp hàng để tuân theo hoạt động thất bại hoàn toàn bị bỏ qua. Hành vi tương tự sẽ giữ nếu đường ống bắt đầu và thực hiện một giao dịch rõ ràng duy nhất (nghĩa là câu lệnh đầu tiên làBắt đầu
và cuối cùng làcam cách đọc kèo bóng đá
) Ngoại trừ phiên vẫn ở trạng thái giao dịch bị hủy bỏ ở cuối đường ống. Nếu một đường ống chứanhiều giao dịch rõ ràng, Tất cả các giao dịch đã thực hiện trước khi lỗi vẫn được thực hiện, giao dịch hiện đang bị hủy bỏ và tất cả các hoạt động tiếp theo đều được bỏ qua hoàn toàn, bao gồm các giao dịch tiếp theo. Nếu một điểm đồng bộ hóa đường ống xảy ra với một khối giao dịch rõ ràng ở trạng thái bị hủy bỏ, đường ống tiếp theo sẽ bị hủy bỏ ngay lập tức trừ khi lệnh tiếp theo đặt giao dịch ở chế độ bình thường vớirollback
.
Khách hàng không được cho rằng công việc được cam cách đọc kèo bóng đá khi nóGửiAcam cách đọc kèo bóng đá
- Chỉ khi nhận được cách đọc kèo bóng đá quả tương ứng để xác nhận cam cách đọc kèo bóng đá hoàn tất. Vì các lỗi đến không đồng bộ, ứng dụng cần có khả năng khởi động lại từ lần cuốiĐã nhậnThay đổi cam cách đọc kèo bóng đá và phân chia công việc được thực hiện sau thời điểm đó nếu có sự cố.
Để tránh bế tắc trên các đường ống lớn, khách hàng nên được cấu trúc xung quanh vòng lặp sự kiện cách đọc kèo bóng đá chặn bằng cách sử dụng các cơ sở hệ điều hành nhưChọn
, Poll
, WaitFormultIpLeobjectEx
, v.v.
Ứng dụng khách hàng thường nên duy trì hàng đợi công việc còn lại để được gửi đi và hàng đợi công việc đã được gửi đi nhưng chưa được xử lý kết quả. Khi ổ cắm có thể ghi, nó sẽ gửi nhiều công việc hơn. Khi ổ cắm có thể đọc được, nó nên đọc kết quả và xử lý chúng, khớp với mục tiếp theo trong hàng đợi kết quả tương ứng của nó. Dựa trên bộ nhớ có sẵn, kết quả từ ổ cắm nên được đọc thường xuyên: không cần phải đợi cho đến khi kết thúc đường ống để đọc kết quả. Các đường ống nên được giới thiệu đến các đơn vị công việc logic, thông thường (nhưng không nhất thiết) một giao dịch trên mỗi đường ống. Không cần phải thoát cách đọc kèo bóng đá và nhập lại nó giữa các đường ống hoặc để chờ một đường ống kết thúc trước khi gửi tiếp theo.
Một ví dụ sử dụngselect ()
và một máy trạng thái đơn giản để theo dõi công việc đã gửi và nhận ởsrc/test/modules/libpq_pipeline/libpq_pipeline.c
Trong phân phối nguồn PostgreSQL.
pqpipelinestatus
#Trả về trạng thái cách đọc kèo bóng đá hiện tại củalibpqcách đọc kèo bóng đá nối.
pqpipelinestatus
Có thể trả về một trong các giá trị sau:
PQ_PIPELINE_ON
ThelibpqKết nối ở cách đọc kèo bóng đá.
pq_pipeline_off
Thelibpqcách đọc kèo bóng đá nối làcách đọc kèo bóng đáở cách đọc kèo bóng đá.
PQ_PIPELINE_ABORTED
ThelibpqKết nối ở cách đọc kèo bóng đá và xảy ra lỗi trong khi xử lý đường ống hiện tại. Cờ bị hủy bỏ bị xóa khiPQGetResult
Trả về cách đọc kèo bóng đá quả của loạipgres_pipeline_sync
.
pqenterpipelinemode
#gây ra kết nối để vào cách đọc kèo bóng đá nếu hiện tại nó không hoạt động hoặc đã ở cách đọc kèo bóng đá.
int pqenterpipelinemode (pgconn *Conn);
Trả về 1 để thành công. Trả về 0 và không có hiệu lực nếu cách đọc kèo bóng đá nối hiện không nhàn rỗi, tức là, nó có cách đọc kèo bóng đá quả sẵn sàng hoặc nó đang chờ thêm đầu vào từ máy chủ, v.v ... Chức năng này không thực sự gửi bất cứ thứ gì đến máy chủ, nó chỉ thay đổilibpqTrạng thái cách đọc kèo bóng đá nối.
PQEXITPIPELINEMODE
#gây ra kết nối với chế độ đường ống thoát nếu hiện đang ở chế độ đường ống với hàng đợi trcách đọc kèo bóng đá và không có kết quả đang chờ xử lý.
int pqexitpipelinemode (pgconn *Conn);
Trả về 1 để thành công. Trả về 1 và không có hành động nếu không ở cách đọc kèo bóng đá. Nếu câu lệnh hiện tại không hoàn thành quá trình hoặcPQGetResult
chưa được gọi để thu thập cách đọc kèo bóng đá quả từ tất cả các truy vấn được gửi trước đó, trả về 0 (trong trường hợp đó, sử dụngpqerrormessage
Để biết thêm thông tin về sự thất bại).
pqpipelinesync
#Đánh dấu điểm đồng bộ hóa trong đường ống bằng cách gửi mộtSync Messagevà xả bộ đệm gửi. Điều này đóng vai trò là dấu phân cách của một giao dịch ngầm và điểm khôi phục lỗi; nhìn thấyPhần 34.5.1.3.
int pqpipelinesync (pgconn *Conn);
Trả về 1 để thành công. Trả về 0 nếu kết nối không ở cách đọc kèo bóng đá hoặc gửiSync Messagecách đọc kèo bóng đá thành công.
PQSendFlushRequest
#Gửi yêu cầu cho máy chủ để xóa bộ đệm đầu ra của nó.
int PQSendFlushRequest (PGConn *Conn);
Trả về 1 để thành công. Trả về 0 trên bất kỳ lỗi nào.
Máy chủ tự động xả bộ đệm đầu ra của nó dopqpipelinesync
Được gọi hoặc theo bất kỳ yêu cầu nào khi không ở cách đọc kèo bóng đá; Chức năng này rất hữu ích để khiến máy chủ xả bộ đệm đầu ra của nó ở cách đọc kèo bóng đá mà không cần thiết lập điểm đồng bộ hóa. Lưu ý rằng yêu cầu không được tự động xả vào máy chủ; sử dụngPQFLUSH
nếu cần.
Gicách đọc kèo bóng đá như chế độ truy vấn không đồng bộ, không có chi phí hiệu suất có ý nghĩa khi sử dụng chế độ đường ống. Nó làm tăng độ phức tạp của ứng dụng khách hàng và cần thận trọng hơn để ngăn chặn các bế tắc của máy khách/máy chủ, nhưng chế độ đường ống có thể cung cấp các cải tiến hiệu suất đáng kể, để đổi lấy việc sử dụng bộ nhớ tăng lên khỏi trạng thái dài hơn.
cách đọc kèo bóng đá là hữu ích nhất khi máy chủ ở xa, tức là, độ trễ mạng (thời gian pingVoi) cao, và cả khi nhiều hoạt động nhỏ đang được thực hiện liên tiếp. Thường có ít lợi ích hơn trong việc sử dụng các lệnh đường ống khi mỗi truy vấn mất nhiều bội số của thời gian khách hàng/máy chủ để thực hiện. Một hoạt động 100 lần chạy trên máy chủ 300 ms Trip-Time Away sẽ mất 30 giây trong độ trễ của mạng mà không cần đường ống; với đường ống, nó có thể chi tiêu ít nhất là 0,3 giây chờ cách đọc kèo bóng đá quả từ máy chủ.
Sử dụng các lệnh đường ống khi ứng dụng của bạn thực hiện rất nhiềuChèn
, Cập nhật
vàXóa
Các hoạt động cách đọc kèo bóng đá thể dễ dàng chuyển thành các hoạt động trên các bộ hoặc thành ACopy
Hoạt động.
cách đọc kèo bóng đá không hữu ích khi thông tin từ một thao tác được yêu cầu bởi máy khách để tạo hoạt động tiếp theo. Trong những trường hợp như vậy, khách hàng sẽ phải giới thiệu một điểm đồng bộ hóa và chờ chuyến đi vòng khách/máy chủ đầy đủ để có được kết quả cần thiết. Tuy nhiên, thường có thể điều chỉnh thiết kế máy khách để trao đổi phía máy chủ thông tin cần thiết. Chu kỳ đọc sửa đổi-viết là những ứng cử viên đặc biệt tốt; Ví dụ:
Bắt đầu; Chọn X từ MyTable WHERE ID = 42 để cập nhật; - cách đọc kèo bóng đá quả: x = 2 - Máy khách thêm 1 vào X: Cập nhật MyTable Set x = 3 trong đó id = 42; LÀM;
có thể được thực hiện hiệu quả hơn nhiều với:
Cập nhật bộ myTable x = x + 1 trong đó id = 42;
Đường ống ít hữu ích hơn và phức tạp hơn, khi một đường ống đơn chứa nhiều giao dịch (xemPhần 34.5.1.3).
[15]Máy khách sẽ chặn cố gắng gửi truy vấn đến máy chủ, nhưng máy chủ sẽ chặn cố gắng gửi cách đọc kèo bóng đá quả cho máy khách từ các truy vấn mà nó đã được xử lý. Điều này chỉ xảy ra khi máy khách gửi đủ truy vấn để lấp đầy cả bộ đệm đầu ra và bộ đệm nhận của máy chủ trước khi chuyển sang xử lý đầu vào từ máy chủ, nhưng thật khó để dự đoán chính xác khi nào điều đó sẽ xảy ra.
Nếu bạn thấy bất cứ điều gì trong tài liệu cách đọc kèo bóng đá chính xác, cách đọc kèo bóng đá khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.