libpqtỷ lệ 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 tỷ lệ 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.
7853_8094
tỷ lệ 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 khi8390_8397S API đường ống được giới thiệu trongPostgreSQL14, Đây là một tính năng phía máy khách khô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 tỷ lệ kèo bóng đá, được thực hiện vớipqenterpipelinemode
. pqpipelinestatus
9346_94259514_9539Sử 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 không được phép, và cũng vậyCopy
. Sử dụng các chức năng thực thi lệnh đồng bộ nhưPQFN
, PQEXEC
, 9859_9873
, PQPrepare
, PQEXECPREPARED
, ,
PQDescriptePortal
, 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ý tỷ lệ kèo bóng đá quả của họ và tỷ lệ 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 tỷ lệ kèo bóng đá vớilibpqinChế độ khô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 tỷ lệ kèo bóng đá, ứng dụng gửi các yêu cầu bằng cách sử dụngPQSendQueryParams
11346_11379PQSendQueryPrepared
. 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 ở tỷ lệ 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ề tỷ lệ 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ờ tỷ lệ kèo bóng đá thúc đường ống. Lưu ý rằng tỷ lệ 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à khô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
tỷ lệ 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 tỷ lệ 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ý tỷ lệ kèo bóng đá quả của một truy vấn trong đường ống, ứng dụng gọiPQGetResult
13863_13907PQGetResult
Trả về null. tỷ lệ 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ý tỷ lệ kèo bóng đá quả tuyên bố cá nhân là bình thường. Khi tỷ lệ kèo bóng đá quả của tất cả các truy vấn trong đường ống đã được trả về,PQGetResult
14285_14333pgres_pipeline_sync
Khách hàng có thể chọn trì hoãn xử lý tỷ lệ kèo bóng đá quả cho đến khi đường ống hoàn chỉnh được gửi hoặc xen kẽ 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 tỷ lệ 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
hành xử gitỷ lệ 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 tỷ lệ kèo bóng đá quả truy vấn thông thường cho lỗi đầu tiên và tất cả các tỷ lệ 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ý tỷ lệ 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 tỷ lệ 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ụ.
libpqKhô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ề tỷ lệ 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 tỷ lệ kèo bóng đá chúng với tỷ lệ 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
tỷ lệ 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ỏ. tỷ lệ kèo bóng đá quả chopqpipelinesync
được báo cáo làpgres_pipeline_sync
Để báo hiệu sự tỷ lệ kèo bóng đá thúc của đường ống bị hủy bỏ và nối lại xử lý tỷ lệ kèo bóng đá quả thông thường.
Máy kháchphảitỷ lệ kèo bóng đá quả xử lý vớiPQGetResult
Trong quá trình phục hồi lỗi.
17783_18093bắt đầu
và cuối cùng làcam tỷ lệ 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 tỷ lệ kèo bóng đá khi nóGửiAcam tỷ lệ kèo bóng đá
- Chỉ khi nhận được tỷ lệ kèo bóng đá quả tương ứng để xác nhận cam tỷ lệ 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 tỷ lệ 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 một vòng lặp sự kiện khô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.
19937_20707
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 tỷ lệ kèo bóng đá hiện tại củalibpqtỷ lệ 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 ở tỷ lệ kèo bóng đá.
PQ_PIPELINE_OFF
Thelibpqtỷ lệ kèo bóng đá nối làkhôngở tỷ lệ kèo bóng đá.
PQ_PIPELINE_ABORTED
ThelibpqKết nối ở tỷ lệ 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ề tỷ lệ kèo bóng đá quả của loạiPGRES_PIPELINE_SYNC
.
pqenterpipelinemode
gây ra kết nối vào tỷ lệ kèo bóng đá nếu nó hiện đang nhàn rỗi hoặc đã ở tỷ lệ 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 tỷ lệ kèo bóng đá nối hiện không nhàn rỗi, tức là, nó có tỷ lệ 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 tỷ lệ kèo bóng đá nối.
PQEXITPIPELINEMODE
gây ra kết nối với chế độ đường ống thoát nếu nó hiện đang ở chế độ đường ống với hàng đợi trtỷ lệ 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 ở tỷ lệ 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 tỷ lệ 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ửiSYNC 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 ở tỷ lệ kèo bóng đá hoặc gửiSYNC MessageKhô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 ở tỷ lệ 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ó ở tỷ lệ 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.
Gitỷ lệ 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.
tỷ lệ kèo bóng đá là hữu ích nhất khi máy chủ ở xa, tức là, độ trễ mạng (Hồithời gian ping) 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ờ tỷ lệ 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 khô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.
tỷ lệ kèo bóng đá không hữu ích khi thông tin từ một thao tác được yêu cầu của khách hàng để 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; - tỷ lệ 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;
Pipelining ít hữu ích hơn và phức tạp hơn, khi một đường ống duy nhất 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 tỷ lệ kèo bóng đá quả cho máy khách từ các truy vấn mà nó đã 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 không chính xác, không phù hợ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.