응용 프로그램 이름 설정
많은 프로세스를 실행하려면 연결 위치를 알아야합니다. PGBouncer는이를 보이지 않게합니다 pg_stat_activity
. application_name
필요한 정보를 신중하게 설정하여이 문제를 해결하십시오 .
# Sets the application name for this connection in the form of
# application-name:user@host
prog = os.path.basename(sys.argv[0]) or 'desjob'
username = pwd.getpwuid (os.getuid ()).pw_name
hostname = socket.gethostname().split(".")[0]·
args.setdefault('connect_args', {'application_name': "%s:%s@%s" %
(prog, username, hostname)})
args.setdefault('isolation_level', "AUTOCOMMIT")
engine = create_engine(url, **args)
세션 선호
Engine 객체의 요청이 여러 연결을 생성하고 유지할 수 있으므로 세션을 사용하십시오. PGBouncer를 사용하면 Postgres에 연결하는 것이 그리 비싸지 않습니다. NullPool
Postgres에서 볼 수있는 유일한 연결이 실제로 사용되는 연결이되도록 항상 사용 합니다.
from sqlalchemy.pool import Pool, NullPool
engine = create_engine(uri, poolclass=NullPool)
유휴 트랜잭션 제거
PGBouncer를 사용하여 확장하려는 경우 트랜잭션을 열린 상태로 두지 않는 것이 중요합니다. 이렇게하려면을 켜야 autocommit
합니다 . 이것은 SQLAlchemy에서는 간단하지 않습니다. "autocommit"이라는 것을 설정할 수있는 세 곳이 있습니다 :
psycopg2 자동 커밋
conn = psycopg2.connect(uri)
conn.autocommit = True
SQLAlchemy는 무슨 일이 일어나고 있는지 알아야하기 때문에 안전하지 않은 것으로 추정됩니다.
세션 자동 커밋
Session = sessionmaker(bind=engine, autocommit=True)
session = Session()
이를 위해서는 신중하고 명확한 전달이 필요합니다.
session.begin()
session.execute(...)
session.rollback()
함수 호출 및 예외 나눠 때문에 대단히 어렵다
begin()
과 commit()
중첩 될 수 없습니다 :
def A():
session.begin()
...
session.rollback()
def B():
session.begin()
try:
A() # error, already open
이 모드에서 psycopg2 autocommit
는 False
(기본값)
엔진 자동 커밋
엔진을 "AUTOCOMMIT"
만들 때 엔진 격리 모드를 설정하면 기존 코드를 변경할 필요가없는 새로운 기본 동작이 설정됩니다.
engine = create_engine(uri, isolation_level="AUTOCOMMIT")
이 모드에서 psycopg2 autocommit
는True
여기서 중요한 문제는 코드 블록이 트랜잭션에 래핑되도록 보장하는 유일한 방법은 명령문을 수동으로 내보내는 것입니다.
session.execute("BEGIN")
#...
session.execute("COMMIT")