PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Мащабиране на връзките в PostgreSQL с помощта на пул на връзки

Отварянето на връзка с база данни е скъпа операция и пулът на връзките се използва за поддържане на връзките към базата данни отворени, така че да могат да бъдат използвани повторно. Това избягва необходимостта от многократно отваряне на мрежови сесии, удостоверяване и проверка на оторизацията. Пулирането поддържа връзките активни, така че когато по-късно бъде поискана връзка, една от активните се използва, вместо да се налага да се създава от нулата.

Пулиране на връзки

Пулирането на връзки се превърна в един от най-често срещаните методи за обработка на връзки към база данни преди заявка за заявка. Обикновено смятаме, че връзката с базата данни е бърза, но това не е така, особено когато се свързват голям брой клиенти. Без пул на връзки, заявка ще отнеме до 35-50 ms за свързване, но 1-2 ms, ако се използва пул на връзки. Следователно пулът на връзките предварително разпределя връзките към базата данни и след това ги рециклира, когато се свързват нови клиенти

Причини за обединяване на връзки

  1. За да избегнете срив на вашия сървър. PostgreSQL сървърите са ограничени до определен брой клиенти, които обработват едновременно в зависимост от параметъра на паметта. Ако това число е надвишено, тогава в крайна сметка ще сринете сървъра. При обединяването на връзки клиентите използват определен брой връзки.
  2. Улесняване на обработката на заявки. Обикновено заявките за база данни се изпълняват по сериен начин с критерий първи дошъл, първи излязъл. При голям набор от клиенти това ще отнеме години, за да се постигне този процес. Следователно подходът трябва да бъде да се направи една връзка с конвейерни заявки, които могат да се изпълняват едновременно, а не всяка по една.
  3. Подобрете сигурността. Често връзката включва ръкостискане, което може да отнеме средно 25-35 ms, през което се установява SSL, проверяват се пароли и се споделя информацията за конфигурацията. Цялата тази работа за всеки свързан потребител ще доведе до широко използване на паметта. Въпреки това, с обединяването на връзки, броят на връзките се намалява, следователно се спестява памет.

Типове пул на връзки

Основно има два типа пул на връзки, но има и трети тип заобикаляне, което действа като стратегия за обединяване на връзки, известна като постоянни връзки.

Постоянен пул на връзки

Този подход има за цел да поддържа първоначалната връзка активна от момента, в който е инициирана. Той не поддържа напълно функциите за обединяване на връзки, но достатъчно добре, за да осигури непрекъсната връзка. Това е доста полезно за малък набор от клиентски връзки, чиито допълнителни разходи могат да варират между 25-50 ms. Ограничение на този подход е, че е ограничен до определен брой връзки към db с обикновено една връзка на вход към сървъра.

Пулиране на рамкова връзка

Обединяването на рамкова връзка се осъществява на ниво приложение, при което всеки път, когато вашият сървърен скрипт се стартира, се установява пул от връзки за обработка на заявки за заявки, които ще пристигнат по-късно.

Самостоятелен пул на връзки

За всяко свързване към базата данни се използва служебна памет между 5 и 10 MB, за да се обслужи заявка за заявка. Това не е много добре за голям брой връзки. Използването на пул на връзки на рамката може да бъде ограничено от този брой връзки, тъй като може да се натъкне на използване на голям размер на паметта. По този начин ние избираме да използваме самостоятелния пул за връзки, който е конфигуриран в съответствие със сесиите, операторите и транзакциите на Postgres. Основното предимство, свързано с този подход, е:минимални режийни разходи от около 2 kb за всяка връзка.

Когато създавате клас за обединяване на връзки, той трябва да отговаря на следните фактори за повишена производителност на базата данни:

  1. Предварително разпределете връзките
  2. Наблюдавайте наличните връзки
  3. Задаване на нови връзки
  4. Изчакайте връзката да бъде налична
  5. Затваряне на връзката
Изтеглете Бялата книга днес Управление и автоматизация на PostgreSQL с ClusterControl Научете какво трябва да знаете, за да внедрите, наблюдавате, управлявате и мащабирате PostgreSQLD Изтеглете Бялата книга

Предварително разпределяне на връзките

Предварителното осигуряване на повече връзки ще улесни обработката на заявките в момента, когато приложението е стартирано. Например, ако вашият сървър е разработен с Java, можете да използвате вектори, за да съхранявате наличните неактивни връзки, като използвате кода по-долу.

availableConnections = new Vector(connections); 
busyConnections = new Vector();
for(int i=0; i<connections; i++) {
availableConnections.addElement(makeNewConnection()); 
}

Наблюдение на наличните връзки

Класът трябва да може да проверява за всяка празна връзка в списък със заети връзки и да я върне. Това основно се прави с цел повторно използване на връзка или затваряне на връзки, които не се използват. Понякога връзките изтичат, следователно, докато връщате връзка, е много важно да проверите дали тя все още е отворена. Ако не, ще трябва да отхвърлите тази връзка и да повторите процеса. Когато връзката бъде отхвърлена, се отваря слот, който може да се използва за обработка на нова връзка, когато лимитът бъде достигнат. Това може да се постигне с

public synchronized Connection getConnection() throws SQLException {
if (!availableConnections.isEmpty()) { Connection existingConnection =
(Connection)availableConnections.lastElement(); int lastIndex = availableConnections.size() - 1; availableConnections.removeElementAt(lastIndex); if (existingConnection.isClosed()) {
notifyAll(); // Freed up a spot for anybody waiting.
return(getConnection()); // Repeat process. } else {
busyConnections.addElement(existingConnection);
return(existingConnection); }
} }

Задаване на нова връзка

Би трябвало да можете да стартирате фонова нишка, за да зададете нова връзка, ако няма свободен режим и ако ограничението на връзката е почти достигнато.

if ((totalConnections() < maxConnections) && !connectionPending) { // Pending = connecting in bg
makeBackgroundConnection(); }
try {
wait(); // Give up lock and suspend self.
} catch(InterruptedException ie) {} return(getConnection()); // Try again.

Чака се нова връзка

Когато няма неактивна връзка и лимитът на връзката е достигнат, конфигурацията трябва да може да изчака нова връзка да бъде налична без непрекъснато обединяване. Можем да направим това с помощта на метода на чакане, който осигурява заключване на синхронизирането на нишката и спира нишката, докато не бъде предоставено известие.

try {
     wait();
} catch(InterruptedException ie) {} 
return(getConnection());

За добра етика на приложението клиентите не трябва да чакат в реално време за връзка, а вие ще хвърляте изключение, когато връзките липсват с кода по-долу:

throw new SQLException("Connection limit reached");

Затваряне на връзката

Когато връзките се събират боклук, трябва да ги затворите, вместо да го правите изрично. Въпреки това, ако искате изричен подход за затваряне на връзка, можете да използвате:

public synchronized void closeAllConnections() {
// The closeConnections method loops down Vector, calling // close and ignoring any exceptions thrown. closeConnections(availableConnections); availableConnections = new Vector(); closeConnections(busyConnections);
busyConnections = new Vector();
}

Заключение

Пулирането на връзки за PostgreSQL ни помага да намалим броя на ресурсите, необходими за свързване към базата данни и подобрява скоростта на свързване с базата данни. Това се постига чрез обединяване на връзки към DB, поддържане на тези връзки и следователно намаляване на броя на връзките, които трябва да бъдат отворени.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Escape функция за регулярен израз или модели LIKE

  2. Мониторинг и одит на производителността PostgreSQL - Топ ресурси

  3. PG::Грешка в клаузата GROUP BY

  4. Конкатениране на низ и число в PostgreSQL

  5. Извикването на съхранена функция или процедура няма да вмъкне и да запази промените