ایگاه داده 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 با برنامه های جاوا معرفی شد و در حال حاضر دیگر زبان ها را پشتیبانی می کند.
در نسخههای قبلی پایگاه داده، 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 با نشان دادن مرزهای زمانی، سطح بیشتری از کنترل را بر روی connection pools ساکن پایگاه داده می دهد. تنظیم POOL_BOUNDARY روی STATEMENT یا TRANSACTION نشان میدهد که در کدام نقطه اتصال میتواند به connection pool بازگردد.
برای اینکه یک session به طور implicitly بدون تابعیت در نظر گرفته شود، باید تمام این شرایط را داشته باشد. در صورت عدم رعایت هر یک از این شرایط، session به طور implicitly حالتی تلقی می شود.
انتخاب مرز استخر ما به نحوه مدیریت 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>
برای دریافت مشاوره، آموزش و خدمات نگهداری پایگاه داده اوراکل با ما در تماس باشید.