pgBouncer로 준비된 문
Aug 25 2020
연결 풀러로 pgBouncer를 사용하는 PostgreSQL 서버가 있습니다.
내 응용 프로그램이 Elixir에서 실행 중입니다.
이것은 pgBouncer의 구성 파일입니다.
* = host=X.X.X.X port=5432
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = 0.0.0.0
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
admin_users = admin
pool_mode = transaction
ignore_startup_parameters = extra_float_digits
server_check_query = select 1
server_check_delay = 30
max_client_conn = 10000
default_pool_size = 5
min_pool_size = 3
reserve_pool_size = 3
server_reset_query = DEALLOCATE ALL;
트랜잭션 풀링을 사용할 때이 오류가 발생합니다.
ERROR 08P01 (protocol_violation) bind message supplies 4 parameters, but prepared statement "ecto_323" requires 2
그런 다음 세션 풀링 모드로 변경했습니다 . 이번에는이 오류가 발생합니다.
ERROR 26000 (invalid_sql_statement_name) prepared statement "ecto_83" does not exist
pgBouncer에서 어떻게 수정합니까?
DB를 직접 연결했을 때 오류가 보이지 않았습니다. 프록시없이 1 년 이상 실행되었습니다. 우리는 지금 pgBouncer를 구현하고 있습니다.
답변
2 LaurenzAlbe Aug 25 2020 at 19:27
세션 풀링 모드의 오류는 pgBouncer와 연결되지 않은 다른 작업을 수행하고 있음을 나타냅니다. 응용 프로그램이 항상 동일한 세션을 가지고있는 경우 준비된 명령문이 누락 된 유일한 설명은 선언되거나 할당 해제되지 않았다는 것입니다. 이는 pgBouncer 없이도 똑같이 발생합니다.
여기서 최대는 모든 것이 세션 풀링 모드에서 작동해야한다는 것입니다.
트랜잭션 풀링 모드의 오류는 다른 문에 대해 동일한 준비된 문 이름을 사용하고 있음을 나타냅니다. 이제 응용 프로그램 스레드가 다음 트랜잭션에서 다른 스레드의 세션을 가져오고 이와 함께 준비된 명령문을 가져 오는 것은 놀라운 일이 아닙니다.
1 GerardH.Pille Aug 25 2020 at 19:52
거래 풀링를 사용하면 응용 프로그램에서 준비된 문을 사용하지 않아야는 말한다 자주 묻는 질문