পিজবাউনসার লেনদেন-স্তরের পুলিংয়ের জন্য এসকিউএলএলচেমিতে কীভাবে সংযোগ পুলিং ব্যবহার করবেন?


15

লেনদেন-স্তরের পুলিং ব্যবহার করে, পিজবউনসারের পিছনে পোস্টগ্র্রেএসকিউএল ডাটাবেসটি অনুসন্ধান করার জন্য এসকিউএএলএলকেমি ব্যবহার করে।

এই ধরণের সেট আপের জন্য ব্যবহার করার জন্য সেরা প্যাটার্নটি কী? আমার কি প্রতি-প্রক্রিয়াতে ConnectionPoolএকটি ইঞ্জিন থাকা উচিত, একটি ব্যবহার করে , বা আমার প্রতি অনুরোধ ইঞ্জিন তৈরি করা উচিত এবং NullPoolতাদের প্রত্যেকটির জন্য ব্যবহার করা উচিত? আমার কি ব্যবহার করা উচিত পুরোপুরি আলাদা প্যাটার্ন আছে?

অনেক ধন্যবাদ! যদি আরও তথ্যের প্রয়োজন হয় তবে আমাকে জানান এবং আমি ASAP আপডেট করব।

উত্তর:


9

পিজিবিউনসারের সাহায্যে আপনি সম্ভবত নুলপুলের সাথে লেগে থাকতে চান। সেই ক্ষেত্রে আপনি সাব-প্রসেসগুলি জুড়ে একটি একক ইঞ্জিন ভাগ করতে পারবেন যেহেতু কোনও সকেট সংযোগ সাবপ্রসেসের সীমানা জুড়ে বহন করা হবে না। তবে আপনি এই সীমাটিতে কোনও সক্রিয় লেনদেনের সাথে একটি সেশনের মতো কোনও সংযোগ অবজেক্টের উল্লেখ করে কিছু ভাগ করতে পারবেন না। আপনি অবশ্যই "ইঞ্জিন-প্রতি-অনুরোধ" করতে চাইবেন না যদিও, একটি ইঞ্জিন একটি ব্যয়বহুল অবজেক্ট যা কোনও নির্দিষ্ট ডাটাবেস ইউআরএলটি এটি প্রথমবার দেখার পরে প্রচুর তথ্য সংগ্রহ করে।


4

অ্যাপ্লিকেশন নাম সেট করুন

আপনি যদি অনেকগুলি প্রক্রিয়া চালানোর প্রত্যাশা করেন তবে তারা কোথায় থেকে সংযুক্ত হচ্ছে তা আপনার জানতে হবে। পিজিবিউনসার এটিকে অদৃশ্য করে তুলবে pg_stat_activityapplication_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)

সেশন পছন্দ করুন

একটি ইঞ্জিন অবজেক্টের অনুরোধগুলি স্প্যান করতে এবং একাধিক সংযোগগুলিতে ধরে রাখতে পারে সেজন্য সেশনগুলি ব্যবহার করুন। পোস্টগ্রিসের সাথে সংযোগ করা খুব ব্যয়বহুল নয়, পিজিবিউনসারের সাথে এটি এত কমও রয়েছে। আমি সর্বদা ব্যবহার করব NullPoolযাতে পোস্টগ্র্রেসে আপনি যে সংযোগগুলি দেখতে পাবেন তা হ'ল সংযোগগুলি যা আসলে ব্যবহৃত হচ্ছে।

from sqlalchemy.pool import Pool, NullPool
engine = create_engine(uri, poolclass=NullPool)

নিষ্ক্রিয় লেনদেনগুলি বাদ দিন

যদি আপনার অভিপ্রায়টি স্ক্রিনে পিজিবিউনসার ব্যবহার করা হয় তবে আপনার পক্ষে লেনদেন বন্ধ রেখে দেওয়া এড়ানো জরুরি। এটি করার জন্য আপনাকে চালু করতে autocommit হবে । এটি এসকিউএএলএলচেমির সাথে সহজ নয় ... এখানে তিনটি জায়গা রয়েছে যেখানে "অটোকোমিট" নামক কিছু সেট করা যেতে পারে:

সাইকোপজি 2 স্বতঃসংশোধন

conn = psycopg2.connect(uri)
conn.autocommit = True

অনিরাপদ অনিরাপদ বলে ধরে নেওয়া হয়েছে কারণ এসকিউএএলএলচেমির নীচে কী ঘটছে তা জানতে হবে।

সেশন অটোকোমিট

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

এই মোডে সাইকোপজি 2 autocommitউপস্থিত হয় False(ডিফল্ট)

ইঞ্জিন অটোকোমিট

ইঞ্জিন "AUTOCOMMIT"তৈরি করার সময় ইঞ্জিন বিচ্ছিন্নতা মোড সেট করা নতুন ডিফল্ট আচরণ স্থাপন করে যা বিদ্যমান কোডে পরিবর্তনের প্রয়োজন হতে পারে না।

engine = create_engine(uri, isolation_level="AUTOCOMMIT")

এই মোডে সাইকোপজি 2 autocommitউপস্থিত হয়True

এখানে প্রধান সমস্যাটি হ'ল গ্যারান্টি দেওয়ার একমাত্র উপায় হ'ল লেনদেনে কোডের একটি ব্লক মোড়ানো আছে তা হ'ল বিবৃতিগুলি ম্যানুয়ালি নির্গত করা:

session.execute("BEGIN")
#...
session.execute("COMMIT")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.