एप्लिकेशन नाम सेट करें
यदि आप कई प्रक्रियाओं को चलाने की अपेक्षा करते हैं, तो आपको यह जानना होगा कि वे कहां से जुड़ रहे हैं। 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)
सत्रों को प्राथमिकता दें
इंजन ऑब्जेक्ट के अनुरोधों के बाद से सत्र का उपयोग कर सकते हैं और कई कनेक्शनों पर जा सकते हैं। Postgres से जुड़ना बहुत महंगा नहीं है, PGBouncer के साथ यह बहुत कम है। मैं हमेशा उपयोग करूंगा NullPool
ताकि पोस्टग्रेज में आपके द्वारा देखे जाने वाले एकमात्र कनेक्शन वास्तव में उपयोग किए जा रहे कनेक्शन हों।
from sqlalchemy.pool import Pool, NullPool
engine = create_engine(uri, poolclass=NullPool)
निष्क्रिय लेनदेन को हटा दें
यदि आपका इरादा PGBouncer को पैमाने पर उपयोग करना है तो यह जरूरी है कि आप लेन-देन को खुला छोड़ देने से बचें। ऐसा करने के लिए आप चालू करने की आवश्यकता autocommit
पर । SQLAlchemy के साथ यह सरल नहीं है ... तीन जगह हैं जहां "ऑटोकॉमिट" नामक कुछ सेट किया जा सकता है:
psycopg2 autocommit
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")