Có cách nào để giữ kết nối tồn tại trong pgAdmin mà không cần đặt nó trên máy chủ không?


14

Tôi đang sử dụng postgres.heroku.com để lưu trữ cơ sở dữ liệu của mình. Điều này có nghĩa là tôi không có cách nào thay đổi cài đặt máy chủ. Do đó, câu trả lời cho này câu hỏi không giúp tôi. Heroku không sẵn sàng thay đổi cài đặt của họ (tôi đã liên hệ với họ).

Tôi đang tự hỏi cách tốt nhất để hack PGAdmin III là gì để duy trì kết nối. Tôi đang nghĩ đến những việc như tạo macro Autohotkey để tự động hóa các hành động giao diện người dùng trong khi PGAdmin ở chế độ nền hoặc có thể sử dụng một số loại công cụ mạng để buộc gửi tin nhắn mạng thay mặt cho PGAdmins.

Tôi cũng đã nhận được một đề nghị 500 đô la cho một người nào đó để đổi sang mã của PGAmin III. Nhà phát triển của PGAdmin, sẽ không sửa đổi mã, chỉ vì Heroku.

Tôi nên làm gì? PGAdmin vượt trội về nhiều mặt, nó chỉ có nhược điểm này.


FYI, Heroku không phải là người duy nhất gặp vấn đề này. Chúng tôi đang gặp vấn đề này trên máy ảo Linux được lưu trữ trên Azure và tôi nghĩ vấn đề là do Nhà cung cấp dịch vụ đóng các kết nối TCP nhàn rỗi. Sẽ rất tuyệt nếu PGAdmin có thể đưa ra tùy chọn giữ mạng
Jonas Stawski

1
Tôi đã có vấn đề này với pgadmin từ năm 2002! Chắc chắn pgadmin có thể được mã hóa để tự động kết nối lại sau khi hết thời gian thay vì bắt bạn đóng ứng dụng, mở lại và mở lại toàn bộ cây?
Matthew Lock

Câu trả lời:


18

libpq, thư viện máy khách PostgreQuery nằm bên dưới, keepalivestùy chọn kích hoạt các thủ tục TCP .

Có vẻ như PGAdmin-III không cho phép bạn chỉ định trực tiếp các tham số kết nối tùy ý, nhưng có một cách giải quyết.

Khi bạn nhìn vào cấu hình kết nối trong PGAdmin-III, bạn sẽ thấy tùy chọn "dịch vụ". Điều này đề cập đến các tập tin dịch vụ kết nối . Để sử dụng nó, hãy tạo một ~/.pg_service.confnội dung như:

[myherokudb]
user=myusername
keepalives=1
connect_timeout=20
keepalives_idle=10

và khi kết nối từ PGAdmin-III, hãy nhập myherokudbvào servicetrường.

Điều này sẽ khiến PGAdmin-III sử dụng các tham số kết nối được chỉ định trong tệp dịch vụ, bao gồm cả cho phép lưu giữ.

(Nếu bạn đang ở trên Windows, tệp dịch vụ có thể ở một vị trí khác; xem tài liệu).

Không có biến môi trường libpqđể kiểm soát các khoản giữ, vì vậy bạn không thể đặt nó theo cách đó, bạn sẽ phải sử dụng tệp dịch vụ.

Việc thêm hỗ trợ cho các tham số kết nối bổ sung vào PGAdmin-III hoặc hộp kiểm trong các tùy chọn kết nối để kiểm soát tham số thủ tục, sẽ khá tầm thường. Tôi tự hỏi nếu Dave hiểu những gì bạn đang yêu cầu tái cung cấp của bạn để tài trợ cho công việc.


Cập nhật : Tệp dịch vụ được tra cứu tại vị trí được chỉ định trong PGSYSCONFDIRbiến môi trường. Nếu không được đặt, nó mặc định là một vị trí dành riêng cho nền tảng, dường như không được ghi lại đúng cách cho Windows. Tôi sẽ gửi một bản vá tài liệu. Các tài liệu cho.pgpass thấy đường dẫn của nó như %APPDATA%\postgresql\pgpass.confthể, vì vậy ~/.pg_service.confnên %APPDATA%\postgresql\pg_service.conf... nhưng dường như không phải vậy.

Trong thực tế, đường dẫn chính xác là:

%APPDATA%\postgresql\.pg_service.conf

Vì thế:

  • Bắt đầu-> Chạy
  • `% APPDATA%
  • tạo thư mục "postgresql" nếu nó không tồn tại
  • tạo tệp ".pg_service.conf" dưới dạng tệp văn bản với nội dung được cung cấp ở trên (xem ghi chú bên dưới đặt lại tên tệp)
  • Trong PGAdmin-III, nhập "localhost" vào tên Máy chủ và tên dịch vụ trong trường dịch vụ.

Tôi đã thử nghiệm trên Windows và thấy rằng bạn không thể để hosttrống trường trong PGAdmin-III trên Windows. PGAdmin-III dường như ghi đè bất kỳ máy chủ lưu trữ nào được chỉ định trong tệp dịch vụ với những gì được chỉ định trong hộp thoại kết nối. Vì vậy, bạn không nên bao gồm một hostkhóa trong tệp dịch vụ. (Tôi sẽ báo cáo lỗi).

Làm cho "ẩn phần mở rộng tệp cho các loại tệp đã biết" bị tắt trong Windows, vì vậy bạn không vô tình gọi nó .pg_service.conf.txtthay vào đó. Nếu bạn không chắc chắn liệu nó có đúng hay không, hãy kiểm tra cột "Loại" trong Windows Explorer trong chế độ xem danh sách; nó sẽ đọc "Tài liệu văn bản" nếu nó được đặt tên không chính xác .pg_service.conf.txtCONF Filenếu nó được đặt tên chính xác .pg_service.conf. Nếu bạn gặp vấn đề khi đổi tên, hãy tắt "ẩn phần mở rộng tệp cho các loại tệp đã biết" hoặc sử dụng trình soạn thảo văn bản hợp lý như notepad ++ để cho phép bạn tạo các tệp có tên theo cách bạn muốn.

Lưu ý giai đoạn hàng đầu (dấu chấm) trong tên tệp. Vâng, điều đó khác với pgpass.conf, và vâng, điều đó gây phiền nhiễu, giáp với một lỗi.


Cảm ơn rất nhiều vì chuyện này! Bây giờ tôi đã dành 45 phút để thử cái này trên máy tính Windows 7 của mình. Điều đầu tiên là tôi không thể để trống trường "máy chủ". Nó sẽ vô hiệu hóa nút "OK" trong hộp thoại đó. Tôi đã cố gắng sử dụng "-" với tư cách là chủ nhà, điều này đưa tôi đến vấn đề thứ hai. Tôi không biết nơi để đặt tệp pg_service.conf. Tôi đã cố gắng thực hiện bản dùng thử và lỗi và đặt nó trong tất cả các thư mục con liên quan đến PGAdmin III và cả trong C: \ Users \ pc \ AppData \ Roaming \ postgresql. Tôi luôn gặp lỗi: "Không tìm thấy định nghĩa dịch vụ" myherokudb "
David

1
Tôi cũng đã cố đọc về pg_service.conf, nhưng dường như tôi chỉ tìm thấy tài liệu đề cập đến nó trong ngữ cảnh phía máy chủ.
David

Tôi không biết bạn đã lấy "bối cảnh phía máy chủ" ở đâu khi tài liệu tôi liên kết để đề cập đến máy khách. Trừ khi bạn cho rằng "unix / linux" có nghĩa là "máy chủ", điều này không có. Vì ban đầu bạn không bận tâm đến việc đề cập đến hệ điều hành nào cho bạn nên tôi không thể nói cụ thể hơn. Bây giờ tôi đã cập nhật câu trả lời với thông tin dành riêng cho Windows (và thật lòng mà nói, nó đủ công bằng để bạn bối rối). Ngoài ra, trên Windows PGAdmin-III dường như ghi đè máy chủ được chỉ định trong tệp dịch vụ với tệp được chỉ định trong Giao diện người dùng, vì vậy hãy để hosttrống trong tệp dịch vụ.
Craig Ringer

Cảm ơn rất nhiều vì sự giúp đỡ của bạn! Giải pháp của bạn chỉ hoạt động! Đó là dấu chấm hàng đầu trong tên tệp làm tôi bối rối, tôi nghĩ đó là một thứ của Linux. Cám ơn bạn một lần nữa!
David

2
Trên thực tế, giải pháp này không hoạt động sau tất cả. Tôi đã mất một thời gian dài để đi đến kết luận đó, nghĩ rằng nó đã gây ra sự mất ổn định mạng của tôi, v.v., nhưng kết nối thực sự vẫn còn thời gian. Tôi tự tin rằng tôi đã làm theo mô tả của bạn. Đó có thể là một trường hợp, heroku đã đặt một cái gì đó để tránh có hàng ngàn kết nối đến các máy chủ thử nghiệm miễn phí của họ lưu trữ hàng trăm cơ sở dữ liệu miễn phí.
David
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.