بهبود Database Resident Connection Pool (DRCP) در پایگاه داده Oracle 23c

ایگاه داده Oracle 23c عملکرد Database Resident Connection Pool (DRCP) را بهبود بخشید تا چندین Pool نامگذاری شده و implicit connection pooling را شامل شود.Database Resident Connection Pool (DRCP) در Oracle 11.1 برای ارائه پشتیبانی از Connection Pool برای برنامه هایی که در حال حاضر از Connection Pool پشتیبانی نمی کنند، معرفی شد. در ابتدا بر روی زبان هایی مانند PHP متمرکز بود، اما در Oracle 12c پشتیبانی از استفاده از DRCP با برنامه های جاوا معرفی شد و در حال حاضر دیگر زبان ها را پشتیبانی می کند.چند Connection Pools نامگذاری شدهدر نسخه‌های قبلی پایگاه داده، Database Resident Connection Pool (DRCP) تنها از یک Pool پیش‌فرض پشتیبانی می‌کرد. در Oracle 23c ما می‌توانیم چندین Connection Pool با نام ایجاد کنیم که هر کدام با پیکربندی متفاوتی هستند و در صورت نیاز می‌توانیم هر Pool را برای یک برنامه خاص تنظیم کنیم.برای آموزش نصب و راه اندازی Oracle 23c اینجا کلیک کنید.ما به root container متصل می شویم و با استفاده از نمای DBA_CPOOL_INFO، Pools موجود را نمایش می دهیم. ما می توانیم ببینیم که فقط Pool پیش فرض وجود دارد.conn / as sysdbacolumn connection_pool format a30select connection_pool,statusfrom dba_cpool_info;CONNECTION_POOL STATUS—————————— —————-SYS_DEFAULT_CONNECTION_POOL INACTIVESQL>ما یک Pool جدید با استفاده از رویه ADD_POOL در بسته DBMS_CONNECTION_POOL ایجاد می کنیم.PROCEDURE ADD_POOLArgument Name Type In/Out Default?—————————— ———————– —— ——–POOL_NAME VARCHAR2 INMINSIZE BINARY_INTEGER IN DEFAULTMAXSIZE BINARY_INTEGER IN DEFAULTINCRSIZE BINARY_INTEGER IN DEFAULTSESSION_CACHED_CURSORS BINARY_INTEGER IN DEFAULTINACTIVITY_TIMEOUT BINARY_INTEGER IN DEFAULTMAX_THINK_TIME BINARY_INTEGER IN DEFAULTMAX_USE_SESSION BINARY_INTEGER IN DEFAULTMAX_LIFETIME_SESSION BINARY_INTEGER IN DEFAULTMAX_TXN_THINK_TIME BINARY_INTEGER IN DEFAULTبیشتر پارامترها دارای مقادیر پیش‌فرض هستند، بنابراین می‌توانیم تنها با ارائه نام Pool، یک connection pool جدید ایجاد کنیم. ما می توانیم تمام مقادیر پیش فرض را در نمای DBA_CPOOL_INFO ببینیم.exec sys.dbms_connection_pool.add_pool(‘test_pool_1’);select *from dba_cpool_infowhere connection_pool = ‘TEST_POOL_1’;CONNECTION_POOL STATUS MINSIZE MAXSIZE INCRSIZE—————————— —————- ———- ———- ———-SESSION_CACHED_CURSORS INACTIVITY_TIMEOUT MAX_THINK_TIME MAX_USE_SESSION———————- —————— ————– —————MAX_LIFETIME_SESSION NUM_CBROK MAXCONN_CBROK MAX_TXN_THINK_TIME CON_ID——————– ———- ————- —————— ———-TEST_POOL_1 INACTIVE ۰ ۴۰ ۲۲۰ ۳۰۰ ۱۲۰ ۵۰۰۰۰۰۸۶۴۰۰ ۱ ۴۰۰۰۰ ۰ ۱SQL>رویه ALTER_PARAM به ما امکان می‌دهد یک پارامتر Pool را پیکربندی کنیم، در حالی که رویه CONFIGURE_POOL به ما امکان می‌دهد همه پارامترهای pool را در یک تماس پیکربندی کنیم. تنظیمات پیش فرض با استفاده از روش RESTORE_DEFAULTS بازیابی می شوند. پارامترهای Pool که در حال حاضر پشتیبانی می شوند در زیر فهرست شده اند.PROCEDURE CONFIGURE_POOLArgument Name Type In/Out Default?—————————— ———————– —— ——–POOL_NAME VARCHAR2 IN DEFAULTMINSIZE BINARY_INTEGER IN DEFAULTMAXSIZE BINARY_INTEGER IN DEFAULTINCRSIZE BINARY_INTEGER IN DEFAULTSESSION_CACHED_CURSORS BINARY_INTEGER IN DEFAULTINACTIVITY_TIMEOUT BINARY_INTEGER IN DEFAULTMAX_THINK_TIME BINARY_INTEGER IN DEFAULTMAX_USE_SESSION BINARY_INTEGER IN DEFAULTMAX_LIFETIME_SESSION BINARY_INTEGER IN DEFAULTMAX_TXN_THINK_TIME BINARY_INTEGER IN DEFAULTما یک connection pool را با استفاده از رویه‌های START_POOL و STOP_POOL شروع و متوقف می‌کنیم. پارامتر POOL_NAME به طور پیش‌فرض روی SYS_DEFAULT_CONNECTION_POOL پیش‌فرض است.exec sys.dbms_connection_pool.start_pool(‘test_pool_1’);select connection_pool,statusfrom dba_cpool_info;CONNECTION_POOL STATUS—————————— —————-SYS_DEFAULT_CONNECTION_POOL INACTIVETEST_POOL_1 ACTIVESQL>exec sys.dbms_connection_pool.stop_pool(‘test_pool_1’);select connection_pool,statusfrom dba_cpool_info;CONNECTION_POOL STATUS—————————— —————-SYS_DEFAULT_CONNECTION_POOL INACTIVETEST_POOL_1 INACTIVESQL>هنگامی که از Pool پیش فرض استفاده می کنیم، می توانیم با افزودن “pooled” به انتهای URL EZConnect متصل شویم.conn testuser1/testuser1@//localhost:1521/freepdb1:pooledبرای اتصال به یک Pool با نام، باید SERVER را به عنوان POOLED و POOL_NAME را در توضیحات اتصال مشخص کنیم. در اینجا نمونه ای از چنین ورودی فایل “tnsnames.ora” آورده شده است.TEST_POOL_1 =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = FREEPDB1)(SERVER = POOLED)(POOL_NAME = TEST_POOL_1)))این به ما امکان می دهد با استفاده از نام مستعار TNS به Pool نامگذاری شده متصل شویم.SQL> conn testuser1/testuser1@test_pool_1Connected.SQL>پس از اتصال، می‌توانیم ببینیم که جلسه ما ادغام شده است.conn / as sysdbaselect serverfrom v$sessionwhere username = ‘TESTUSER1’;SERVER———POOLEDSQL>برای بررسی آمار استفاده از Pool می‌توانیم به نماهای V$CPOOL_CC_INFO، V$CPOOL_CC_STATS و V$CPOOL_STATS نگاه کنیم.با استفاده از دستورات زیر یک Pool را حذف می کنیم.exec sys.dbms_connection_pool.stop_pool(‘test_pool_1’);exec sys.dbms_connection_pool.remove_pool(‘test_pool_1’);به‌طور پیش‌فرض، connection pools در سطح root container مدیریت می‌شوند، اما این رفتار را می‌توان با تنظیم پارامتر ENABLE_PER_PDB_DRCP روی true تغییر داد، همانطور که در زیر نشان داده شده است.به طور پیش فرض connection pools در سطح PDB در دسترس نیستند. تلاش برای ایجاد یک خطای زیر را به همراه خواهد داشت.SQL> exec sys.dbms_connection_pool.add_pool(‘test_pool_1’);BEGIN sys.dbms_connection_pool.add_pool(‘test_pool_1’); END;*ERROR at line 1:ORA-56515: DRCP: Operation not allowed from a Pluggable DatabaseORA-06512: at “SYS.DBMS_CONNECTION_POOL”, line 3ORA-06512: at line 1SQL>قبل از اینکه بتوانیم از connection pools در سطح PDB استفاده کنیم، باید برخی از پارامترها را در root container تنظیم کنیم.conn / as sysdbaalter system set connection_brokers='((type=pooled)(brokers=1)(connections=40000))’;alter system set enable_per_pdb_drcp=true scope=spfile;shutdown immediate;startup;هنگامی که پارامتر ENABLE_PER_PDB_DRCP روی true تنظیم شد، دیگر نمی‌توانیم connection pools را از root container مدیریت کنیم.conn / as sysdbaexec sys.dbms_connection_pool.add_pool(‘test_pool_1’);BEGIN sys.dbms_connection_pool.add_pool(‘test_pool_1’); END;*ERROR at line 1:ORA-56615: DRCP: Operation not allowed from the ROOTORA-06512: at “SYS.DBMS_CONNECTION_POOL”, line 3ORA-06512: at line 1SQL>پس از اتصال به PDB می‌توانیم Pools را همانطور که در بخش قبل توضیح داده شد مدیریت کنیم.conn sys/SysPassword1@localhost:1521/freepdb1 as sysdbaexec sys.dbms_connection_pool.add_pool(‘test_pool_1’);select connection_pool,statusfrom dba_cpool_info;CONNECTION_POOL STATUS—————————— —————-SYS_DEFAULT_CONNECTION_POOL ACTIVETEST_POOL_1 INACTIVESQL>برای پاکسازی و بازگشت به حالت قبلی، باید Pool را حذف کرده و پارامتر ENABLE_PER_PDB_DRCP را بازنشانی کنیم.exec sys.dbms_connection_pool.stop_pool(‘test_pool_1’);exec sys.dbms_connection_pool.remove_pool(‘test_pool_1’);conn / as sysdbaalter system set enable_per_pdb_drcp=false scope=spfile;shutdown immediate;startup;Implicit Connection PoolingImplicit Connection Pooling با نشان دادن مرزهای زمانی، سطح بیشتری از کنترل را بر روی connection pools ساکن پایگاه داده می دهد. تنظیم POOL_BOUNDARY روی STATEMENT یا TRANSACTION نشان می‌دهد که در کدام نقطه اتصال می‌تواند به connection pool بازگردد.STATEMENT: هنگامی که session بطور implicitly بدون حالت باشد، اتصال به connection pool باز می گردد.TRANSACTION: هنگامی که یک تراکنش به پایان می رسد، اتصال به connection pool باز می گردد.برای اینکه یک session به طور implicitly بدون تابعیت در نظر گرفته شود، باید تمام این شرایط را داشته باشد. در صورت عدم رعایت هر یک از این شرایط، session به طور implicitly حالتی تلقی می شود.تمام cursors باز تا تکمیل واکشی شده اند.هیچ تراکنش فعالی وجود ندارد.بدون temporary LOBs.هیچ global temporary tables حاوی ردیف وجود ندارد.هیچ private temporary tables باز نیست.انتخاب مرز استخر ما به نحوه مدیریت sessions برنامه بستگی دارد. برای برنامه‌هایی که بعید است sessions به طور implicitly بدون حالت باشند، اما ما می‌خواهیم انتشار را به استخر بازگردانیم، در این صورت مرز تراکنش استخر بهترین گزینه است. اگر می دانیم که sessions ما عمدتاً به طور implicitly بدون حالت هستند، پس statement pool boundary خوب است.ما تنظیم POOL_BOUNDARY را به ورودی فایل قبلی “tnsnames.ora” خود اضافه می کنیم تا Implicit Connection Pooling با مرز TRANSACTION را فعال کنیم.TEST_POOL_1 =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = FREEPDB1)(SERVER = POOLED)(POOL_NAME = TEST_POOL_1)(POOL_BOUNDARY=TRANSACTION)))ما به همان روشی که قبلا انجام دادیم وصل می شویم.SQL> conn testuser1/testuser1@test_pool_1Connected.SQL>برای دریافت مشاوره، آموزش و خدمات نگهداری پایگاه داده اوراکل با ما در تماس باشید.منبع مستند