В PostgreSQL существует несколько видов блокировок, которые используются для управления конкурентным доступом к данным и обеспечения целостности транзакций.
Эти блокировки применяются к целым таблицам и используются для операций, которые требуют эксклюзивного доступа к таблице.
Блокировка на уровне доступа для чтения данных из таблицы (например, при выполнении команды
SELECT). Не блокирует другие команды SELECT.Блокировка уровня строки, позволяющая другим транзакциям выполнять команды
SELECT FOR UPDATE и SELECT FOR SHARE.Блокировка, применяемая при вставке, обновлении или удалении строк (
INSERT, UPDATE, DELETE). Блокирует блокировки SHARE и EXCLUSIVE.Используется для выполнения команд, которые обновляют индексы, но не данные (
VACUUM). Блокирует другие блокировки SHARE UPDATE EXCLUSIVE и более строгие.Блокировка для чтения данных из таблицы с возможностью блокировки изменений. Используется для операций, которые должны видеть согласованное состояние данных (
ANALYZE).Используется для команд, которые выполняют чтение с возможностью блокировки последующих изменений, таких как
CREATE INDEX CONCURRENTLY.Блокирует доступ к таблице для всех операций, кроме команд
SELECT и команд с уровнем блокировки ACCESS SHARE.Самая строгая блокировка, блокирующая все другие операции. Применяется для структурных изменений таблицы (
ALTER TABLE, DROP TABLE).Эти блокировки применяются к отдельным строкам таблицы и используются для управления конкурентным доступом к данным на более детальном уровне.
Блокирует выбранные строки для обновления другими транзакциями. Строки с такой блокировкой могут быть изменены только текущей транзакцией.
Блокирует строки для чтения, но не для изменения. Другие транзакции могут читать эти строки, но не изменять их.
Похоже на
SELECT FOR UPDATE, но позволяет другим транзакциям выполнять операции, не изменяющие ключи.Похоже на
SELECT FOR SHARE, но позволяет другим транзакциям выполнять операции, не изменяющие строки.Эти блокировки применяются к индексам и используются для управления доступом к индексированным данным.
Используются автоматически при доступе к индексам для обеспечения целостности данных. Это может включать блокировки при обновлении индексов или их чтении.
Дедлоки возникают, когда две или более транзакций блокируют друг друга, ожидая освобождения ресурсов, которые заблокированы друг другом. PostgreSQL автоматически обнаруживает дедлоки и прерывает одну из транзакций для их разрешения.
Использование блокировок для предотвращения конкурентных изменений данных.
Применение блокировок для управления доступом к ресурсам в многопользовательских средах.
Выбор оптимальных типов блокировок для балансировки между целостностью данных и производительностью.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Блокировки (локи) в базе данных - это механизмы, которые управляют доступом к данным, чтобы обеспечить их целостность и предотвратить конфликты при одновременном доступе нескольких транзакций.
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
Выполнение каждой транзакции в изолированном контексте.
Предотвращение одновременного изменения данных, что может привести к их несогласованности.
Блокировки могут предотвращать одновременное изменение состояния товара.
При переводе средств используются блокировки для предотвращения одновременного списания или зачисления.
При одновременном редактировании одной записи несколькими пользователями.
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
Блокировки высокой гранулярности могут снижать производительность.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Настройка параметров конфигурации PostgreSQL для журналирования медленных запросов позволяет отслеживать запросы, выполнение которых занимает много времени.
postgresql.conf).# Включить логирование всех запросов
log_statement = 'all'
# Либо логирование только медленных запросов
log_min_duration_statement = 1000 # Логировать запросы, выполнение которых заняло более 1000 мс (1 секунда)
sudo systemctl restart postgresql
Расширение
pg_stat_statements позволяет собирать статистику по выполненным запросам и предоставляет информацию о частоте, времени выполнения и других характеристиках запросов.postgresql.conf:shared_preload_libraries = 'pg_stat_statements'
sudo systemctl restart postgresql
CREATE EXTENSION pg_stat_statements;
SELECT
query,
calls,
total_time,
mean_time,
stddev_time,
rows,
min_time,
max_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;
Команды
EXPLAIN и EXPLAIN ANALYZE позволяют понять, как PostgreSQL планирует и выполняет запросы, предоставляя детальную информацию о плане выполнения.EXPLAIN для запроса:EXPLAIN SELECT * FROM my_table WHERE id = 1;
EXPLAIN ANALYZE для запроса:EXPLAIN ANALYZE SELECT * FROM my_table WHERE id = 1;
pg_stat_activity: Показывает текущую активность базы данных, включая выполняемые запросы и их состояние.
SELECT
pid,
usename,
state,
query,
now() - query_start AS duration
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;
pg_locks: Отображает информацию о текущих блокировках в базе данных.
SELECT * FROM pg_locks;
Убедитесь, что для часто используемых условий
WHERE и JOIN существуют соответствующие индексы.Попробуйте переписать запросы для улучшения их производительности.
Используйте материализованные представления для часто выполняемых сложных запросов.
Настройте параметры конфигурации PostgreSQL для оптимизации производительности (например,
work_mem, shared_buffers, maintenance_work_mem).Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Для выбора данных из двух таблиц без использования метода
JOIN можно использовать подзапросы. Подзапросы позволяют выполнять вложенные запросы, где результат одного запроса используется в другом запросе.Вы можете использовать подзапрос в операторе
SELECT, чтобы извлечь данные из одной таблицы, используя значения из другой таблицы.SELECT
o.order_id,
o.order_date,
(SELECT c.customer_name FROM customers c WHERE c.customer_id = o.customer_id) AS customer_name
FROM
orders o;
Вы можете использовать подзапрос в операторе
WHERE, чтобы фильтровать данные на основе условий из другой таблицы.SELECT
o.order_id,
o.order_date
FROM
orders o
WHERE
o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.city = 'New York');
Вы можете использовать подзапрос в операторе
FROM, чтобы создать временную таблицу и затем выбрать данные из нее.SELECT
c.customer_name,
latest_orders.order_id,
latest_orders.order_date
FROM
customers c,
(SELECT
o.customer_id,
o.order_id,
o.order_date
FROM
orders o
WHERE
o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id)
) AS latest_orders
WHERE
c.customer_id = latest_orders.customer_id;
Подзапросы могут быть полезны при использовании агрегатных функций для получения обобщенной информации из одной таблицы, связанной с другой таблицей.
SELECT
c.customer_name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.customer_id) AS total_orders
FROM
customers c;
Оператор
EXISTS проверяет наличие строк в подзапросе и возвращает TRUE, если подзапрос возвращает хотя бы одну строку.SELECT
c.customer_name
FROM
customers c
WHERE
EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
Чтобы выбрать данные из двух таблиц в одном запросе, используется оператор JOIN. Например, INNER JOIN объединяет строки, где есть совпадения в обеих таблицах, а LEFT JOIN возвращает все строки из первой таблицы и соответствующие строки из второй, заполняя NULL там, где данных нет.
В SQL существует несколько видов операторов JOIN, которые позволяют объединять данные из двух или более таблиц на основе определенных условий. Основные типы JOIN включают
INNER JOIN, LEFT JOIN, RIGHT JOIN, и каждый из них имеет свои особенности и использование. Рассмотрим их различия на примере двух таблиц:Таблица A:
id | name
-----------
1 | Alice
2 | Bob
3 | Charlie
Таблица B:
id | city
-----------
1 | New York
3 | Los Angeles
4 | Chicago
INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах. Если нет совпадающих строк, такие строки не включаются в результат.SELECT A.id, A.name, B.city
FROM A
INNER JOIN B ON A.id = B.id;
Результат:
id | name | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles
LEFT JOIN возвращает все строки из левой таблицы (A) и совпадающие строки из правой таблицы (B). Если совпадения не найдено, в результате будут строки из левой таблицы с NULL значениями для столбцов из правой таблицы.SELECT A.id, A.name, B.city
FROM A
LEFT JOIN B ON A.id = B.id;
Результат:
id | name | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles
RIGHT JOIN возвращает все строки из правой таблицы (B) и совпадающие строки из левой таблицы (A). Если совпадения не найдено, в результате будут строки из правой таблицы с NULL значениями для столбцов из левой таблицы.SELECT A.id, A.name, B.city
FROM A
RIGHT JOIN B ON A.id = B.id;
Результат:
id | name | city
------------------------
1 | Alice | New York
3 | Charlie | Los Angeles
4 | NULL | Chicago
FULL JOIN возвращает все строки, когда есть совпадение в одной из таблиц. Это объединение LEFT JOIN и RIGHT JOIN. Если совпадения не найдено, результат будет содержать NULL значения для столбцов из другой таблицы.SELECT A.id, A.name, B.city
FROM A
FULL JOIN B ON A.id = B.id;
id | name | city
------------------------
1 | Alice | New York
2 | Bob | NULL
3 | Charlie | Los Angeles
4 | NULL | Chicago
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👾1
Основные различия между ними касаются структуры данных, модели управления данными, масштабируемости, и подходов к транзакциям.
MySQL использует фиксированную схему, что означает, что структура таблиц (колонки, типы данных) должна быть определена заранее и изменения могут быть сложными. Данные хранятся в таблицах с фиксированным набором столбцов.
MySQL использует SQL для определения, манипуляции и управления данными. Поддерживает ACID (Atomicity, Consistency, Isolation, Durability) свойства, что обеспечивает надежные и согласованные транзакции.
Легче масштабировать вертикально (увеличение мощности одного сервера), но горизонтальная масштабируемость (распределение на несколько серверов) сложнее и требует дополнительных усилий (например, шардинг).
Хорошо подходит для приложений с четко определенными структурами данных, такими как CRM, ERP системы, финансовые приложения и системы управления содержимым (CMS).
NoSQL базы данных поддерживают гибкие и динамические схемы данных, что позволяет легко изменять структуру данных без необходимости изменения схемы. Поддерживают различные модели данных, включая документные, ключ-значение, графовые и колонковые базы данных.
Используют разные способы доступа и управления данными, которые не требуют использования SQL. NoSQL базы данных часто следуют принципу CAP-теоремы (Consistency, Availability, Partition tolerance), делая акцент на доступности и устойчивости к разделению, иногда жертвуя строгой консистентностью.
Легко масштабируются горизонтально, распределяя данные и нагрузку на несколько серверов, что позволяет эффективно работать с большими объемами данных и высокой нагрузкой.
Подходят для приложений, работающих с большими объемами данных и требующих высокой скорости обработки, таких как социальные сети, интернет-магазины, системы аналитики, IoT приложения.
MySQL: Фиксированная схема, данные хранятся в таблицах.
NoSQL: Гибкая схема, данные могут храниться в документах, ключ-значение, графах или столбцах.
MySQL: SQL для запросов и управления данными.
NoSQL: Различные модели данных и запросов, не обязательно SQL.
MySQL: Поддерживает ACID транзакции.
NoSQL: Поддержка транзакций варьируется, часто следуют CAP-теореме, обеспечивая доступность и устойчивость к разделению.
MySQL: Для вертикальной масштабируемости.
NoSQL: Для горизонтальной масштабируемости.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Каждая запись в одной таблице связана с одной и только одной записью в другой таблице.
Пользователь (User) и Паспорт (Passport)
Каждому пользователю соответствует один уникальный паспорт. В реляционных базах данных можно реализовать эту связь с помощью уникального внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE passports (
id SERIAL PRIMARY KEY,
user_id INTEGER UNIQUE,
passport_number VARCHAR(50),
FOREIGN KEY (user_id) REFERENCES users(id)
);
Каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, но каждая запись в другой таблице связана только с одной записью в первой таблице.
Пользователь (User) и Заказы (Orders)
Один пользователь может сделать много заказов, но каждый заказ связан с одним пользователем. Эта связь обычно реализуется с помощью внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Каждая запись в одной таблице может быть связана с множеством записей в другой таблице, и наоборот.
Студенты (Students) и Курсы (Courses)
Один студент может записаться на множество курсов, и каждый курс может быть записан многими студентами. Эта связь обычно реализуется с помощью промежуточной таблицы (таблицы связи), которая содержит внешние ключи обеих связанных таблиц.
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE student_courses (
student_id INTEGER,
course_id INTEGER,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
В нереляционных базах данных связи могут быть организованы иначе, поскольку они часто не поддерживают традиционные реляционные модели.
Вложенные документы
Например, в MongoDB документы могут включать вложенные документы или массивы, что позволяет моделировать отношения "один ко многим" и "многие ко многим" внутри одного документа.
{
"_id": 1,
"name": "John",
"orders": [
{ "order_id": 1, "order_date": "2023-08-01" },
{ "order_id": 2, "order_date": "2023-08-05" }
]
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Это вариации стандарта SQL, используемые различными системами управления базами данных (СУБД). Хотя основа SQL является стандартизированной и поддерживается всеми СУБД, каждая из них может добавлять свои расширения и специфические особенности. Эти уникальные элементы и образуют диалекты SQL.
Разные СУБД могут иметь оптимизации, которые лучше работают с их архитектурой, что приводит к созданию специфических синтаксических конструкций.
Включение дополнительных функций, которые не охватываются стандартом SQL, для удовлетворения специфических потребностей пользователей.
Некоторые диалекты развивались на основе ранних версий SQL, и их отличия сохранились в современных реализациях.
Поддержка специфичных функций, таких как
LIMIT для ограничения числа возвращаемых строк, функции работы с датой и временем, специфичные для MySQL.SELECT * FROM users LIMIT 10;
Расширенная поддержка типов данных, таких как JSON и массивы, поддержка оконных функций, богатый набор встроенных функций.
SELECT * FROM users WHERE age > 30 ORDER BY name OFFSET 10 LIMIT 10;
Сложные типы данных, PL/SQL для написания хранимых процедур и триггеров, поддержка соединений
CONNECT BY для работы с иерархическими данными.SELECT * FROM users WHERE ROWNUM <= 10;
Поддержка
TOP для ограничения числа возвращаемых строк, встроенный язык T-SQL для написания процедур и триггеров, специфичные функции для работы с датой и временем.SELECT TOP 10 * FROM users;
Легковесная база данных, встраиваемая в приложения, поддержка ограниченного набора функций SQL, отсутствие полноценной поддержки некоторых функций, таких как внешние ключи до версии 3.6.19.
SELECT * FROM users LIMIT 10 OFFSET 0;
Не все SQL-запросы могут быть совместимы между различными СУБД из-за различий в синтаксисе и поддерживаемых функциях.
При переносе базы данных с одной СУБД на другую может потребоваться переписывание запросов и процедур для обеспечения совместимости.
Каждая СУБД предоставляет документацию по своим диалектам SQL, где описаны специфичные функции и их использование.
MySQL и PostgreSQL
SELECT * FROM users LIMIT 10 OFFSET 20;
SQL Server
SELECT * FROM users ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
Oracle
SELECT * FROM (
SELECT u.*, ROWNUM rnum
FROM (SELECT * FROM users ORDER BY name) u
WHERE ROWNUM <= 30
)
WHERE rnum > 20;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Это две разные системы управления базами данных (СУБД), каждая из которых имеет свои уникальные особенности, применения и случаи использования.
SQLite
Встраиваемая СУБД: SQLite - это библиотека, которая встраивается непосредственно в приложение. Она не требует отдельного сервера для работы.
Без сервера: Работает без необходимости запуска серверного процесса, что упрощает установку и настройку.
Файловая система: Все данные хранятся в одном файле базы данных на диске.
SQL Server Express
Серверная СУБД: SQL Server Express - это урезанная версия Microsoft SQL Server, требующая установки и запуска серверного процесса.
Клиент-серверная архитектура: Клиенты подключаются к серверу базы данных через сеть.
Разделенные файлы данных и логов: Данные и логи хранятся в отдельных файлах.
SQLite
Легковесная и быстрая: Подходит для приложений с небольшими или средними объемами данных и низкими требованиями к многопользовательскому доступу.
Ограниченная многопользовательская поддержка: Поддерживает ограниченное количество одновременных пользователей, так как блокировки осуществляются на уровне файла.
SQL Server Express
Масштабируемость: Подходит для приложений с высокими требованиями к производительности и поддерживает значительное количество одновременных пользователей.
Многопользовательская поддержка: Обеспечивает управление многопользовательским доступом и параллельностью транзакций.
SQLite:
Основные возможности SQL: Поддерживает основные команды SQL, такие как SELECT, INSERT, UPDATE, DELETE.
Ограниченные возможности: Отсутствие многих расширенных функций, таких как триггеры, хранимые процедуры, сложные типы данных и транзакции с несколькими заявлениями.
SQL Server Express:
Расширенные возможности: Поддержка триггеров, хранимых процедур, полнотекстового поиска, транзакций и других продвинутых функций.
Ограничения по сравнению с полной версией: SQL Server Express имеет ограничения по объему базы данных (до 10 ГБ на одну базу данных) и по использованию ресурсов (до 1 ГБ ОЗУ и 1 процессор).
SQLite:
Простота установки: Не требует установки, просто включается как библиотека в приложение.
Легкость развертывания: Так как данные хранятся в одном файле, перемещение базы данных сводится к копированию этого файла.
SQL Server Express:
Требует установки: Необходимо установить серверную часть, что может включать несколько шагов настройки.
Администрирование: Требует определенного уровня администрирования для настройки безопасности, резервного копирования и восстановления данных.
SQLite:
Мобильные приложения: Часто используется в мобильных приложениях (например, Android и iOS) для локального хранения данных.
Встроенные системы: Подходит для встроенных систем и IoT устройств.
Прототипирование и тестирование: Удобен для быстрого создания прототипов и тестирования.
SQL Server Express:
Веб-приложения: Хорошо подходит для небольших веб-приложений и сервисов, особенно на платформе Windows.
Настольные приложения: Используется в настольных приложениях, требующих мощной базы данных.
Учебные цели: Часто используется в образовательных целях для обучения работе с SQL Server.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Это стандартный протокол для веб-серверов, который позволяет запускать внешние программы (скрипты) для генерации веб-страниц динамически. CGI скрипты могут быть написаны на различных языках программирования, таких как Perl, Python, PHP, C и других. Когда веб-сервер получает запрос на страницу, обрабатываемую CGI, он запускает соответствующий скрипт и передает ему данные запроса.
CGI прост в реализации и не требует сложной настройки. Поддерживает множество языков программирования, что делает его универсальным решением.
CGI является стандартом и поддерживается практически всеми веб-серверами.
Каждый запрос запускает новый процесс, что обеспечивает изоляцию запросов и повышает безопасность.
Каждый запрос создает новый процесс, что может быть ресурсоемким и замедлять работу сервера при большом количестве запросов. Создание и завершение процессов занимает время, что увеличивает задержку ответа.
Плохая производительность при высоких нагрузках делает CGI плохо подходящим для масштабируемых веб-приложений. Ограниченная возможность использования пула процессов для повышения эффективности.
Сложнее интегрироваться с современными технологиями и фреймворками. Отсутствие встроенных средств для работы с сессиями, аутентификацией и другими функциями современных веб-приложений.
Улучшенная версия CGI, которая повторно использует процессы для обработки нескольких запросов, что повышает производительность.
Языки и фреймворки, такие как PHP, ASP.NET, Node.js, Django, Ruby on Rails, которые интегрируются непосредственно с веб-серверами и обеспечивают высокую производительность.
Стандартный интерфейс для Python-приложений, позволяющий эффективную обработку запросов.
Серверы приложений, такие как Apache Tomcat, JBoss, которые предоставляют контейнеры для выполнения веб-приложений и управления ими.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5