مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۶ دقیقه·۱ سال پیش

بهبود 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 sysdba

column connection_pool format a30

select connection_pool,

status

from   dba_cpool_info;

CONNECTION_POOL                STATUS

—————————— —————-

SYS_DEFAULT_CONNECTION_POOL    INACTIVE

SQL>

ما یک Pool جدید با استفاده از رویه ADD_POOL در بسته DBMS_CONNECTION_POOL ایجاد می کنیم.

PROCEDURE ADD_POOL

Argument Name                  Type                    In/Out Default?

—————————— ———————– —— ——–

POOL_NAME                      VARCHAR2                IN

MINSIZE                        BINARY_INTEGER          IN     DEFAULT

MAXSIZE                        BINARY_INTEGER          IN     DEFAULT

INCRSIZE                       BINARY_INTEGER          IN     DEFAULT

SESSION_CACHED_CURSORS         BINARY_INTEGER          IN     DEFAULT

INACTIVITY_TIMEOUT             BINARY_INTEGER          IN     DEFAULT

MAX_THINK_TIME                 BINARY_INTEGER          IN     DEFAULT

MAX_USE_SESSION                BINARY_INTEGER          IN     DEFAULT

MAX_LIFETIME_SESSION           BINARY_INTEGER          IN     DEFAULT

MAX_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_info

where  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_POOL

Argument Name                  Type                    In/Out Default?

—————————— ———————– —— ——–

POOL_NAME                      VARCHAR2                IN     DEFAULT

MINSIZE                        BINARY_INTEGER          IN     DEFAULT

MAXSIZE                        BINARY_INTEGER          IN     DEFAULT

INCRSIZE                       BINARY_INTEGER          IN     DEFAULT

SESSION_CACHED_CURSORS         BINARY_INTEGER          IN     DEFAULT

INACTIVITY_TIMEOUT             BINARY_INTEGER          IN     DEFAULT

MAX_THINK_TIME                 BINARY_INTEGER          IN     DEFAULT

MAX_USE_SESSION                BINARY_INTEGER          IN     DEFAULT

MAX_LIFETIME_SESSION           BINARY_INTEGER          IN     DEFAULT

MAX_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,

status

from   dba_cpool_info;

CONNECTION_POOL                STATUS

—————————— —————-

SYS_DEFAULT_CONNECTION_POOL    INACTIVE

TEST_POOL_1                    ACTIVE

SQL>

exec sys.dbms_connection_pool.stop_pool(‘test_pool_1’);

select connection_pool,

status

from   dba_cpool_info;

CONNECTION_POOL                STATUS

—————————— —————-

SYS_DEFAULT_CONNECTION_POOL    INACTIVE

TEST_POOL_1                    INACTIVE

SQL>

هنگامی که از 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_1

Connected.

SQL>

پس از اتصال، می‌توانیم ببینیم که جلسه ما ادغام شده است.

conn / as sysdba

select server

from   v$session

where  username = ‘TESTUSER1’;

SERVER

———

POOLED

SQL>

برای بررسی آمار استفاده از 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 Database

ORA-06512: at “SYS.DBMS_CONNECTION_POOL”, line 3

ORA-06512: at line 1

SQL>

قبل از اینکه بتوانیم از connection pools در سطح PDB استفاده کنیم، باید برخی از پارامترها را در root container تنظیم کنیم.

conn / as sysdba

alter 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 sysdba

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-56615: DRCP: Operation not allowed from the ROOT

ORA-06512: at “SYS.DBMS_CONNECTION_POOL”, line 3

ORA-06512: at line 1

SQL>

پس از اتصال به PDB می‌توانیم Pools را همانطور که در بخش قبل توضیح داده شد مدیریت کنیم.

conn sys/SysPassword1@localhost:1521/freepdb1 as sysdba

exec sys.dbms_connection_pool.add_pool(‘test_pool_1’);

select connection_pool,

status

from   dba_cpool_info;

CONNECTION_POOL                STATUS

—————————— —————-

SYS_DEFAULT_CONNECTION_POOL    ACTIVE

TEST_POOL_1                    INACTIVE

SQL>

برای پاکسازی و بازگشت به حالت قبلی، باید 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 sysdba

alter system set enable_per_pdb_drcp=false scope=spfile;

shutdown immediate;

startup;

Implicit Connection Pooling

Implicit 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_1

Connected.

SQL>

برای دریافت مشاوره، آموزش و خدمات نگهداری پایگاه داده اوراکل با ما در تماس باشید.

منبع مستند

Database Resident Connection Pool (DRCP)oracle databaseoracleمشاوره اوراکلخدمات اوراکل
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید