Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14
Phiên bản phát triển:18 / Devel

34,5. cách đọc kèo bóng đá#

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.

34.5.1. Sử dụng cách đọc kèo bóng đá#

Để 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. pqpipelinestatuscó 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.PQSendQuerycũ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.

Lưu ý

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]

34.5.1.1. Phát hành truy vấn#

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ụngPQSendQueryParamshoặ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, 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ớiPQPipelinesynchoặ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_ABORTEDcá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.

34.5.1.2. cách đọc kèo bóng đá quả xử lý#

Để xử lý cách đọc kèo bóng đá quả của một truy vấn trong đường ống, ứng dụng gọiPQGetResultLiên tục và xử lý từng cách đọc kèo bóng đá quả cho đến khiPQGetResultTrả 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ụngPQGetResultMộ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ề,PQGetResultTrả 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ọiPQSetSinglerowModeTrướ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.

PQGetResulthoạ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ớipgresultloạipgres_pipeline_syncPGRES_PIPELINE_ABORTED. PGRES_PIPELINE_SYNCđược báo cáo chính xác một lần cho mỗipqpipelinesyncTạ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ừPQGetResultTrả 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.

34.5.1.3. Xử lý lỗi#

Từ quan điểm của khách hàng, sauPQResultstatusreturnPGRES_FATAL_ERROR, đường ống được gắn cờ là bị hủy bỏ.PQResultstatussẽ báo cáo APGRES_PIPELINE_ABORTEDcá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ớiPQGetResultTrong 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 đầuvà 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.

Lưu ý

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ố.

34.5.1.4. Xử lý cách đọc kèo bóng đá quả xen kẽ và công văn truy vấn#

Để 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.cTrong phân phối nguồn PostgreSQL.

34.5.2. Các chức năng được liên kết với cách đọc kèo bóng đá#

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.


          

pqpipelinestatusCó 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 khiPQGetResultTrả 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ặcPQGetResultchư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ụngPQFLUSHnếu cần.

34.5.3. Khi nào nên sử dụng cách đọc kèo bóng đá#

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ậtXóaCá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 ACopyHoạ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.

Gửi hiệu chỉnh

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.