Для простого приложения базы данных доступ к базе данных не очень частый. В настоящее время вы можете просто создать новое соединение, когда вам нужно получить доступ к базе данных, и закрыть его, когда вы закончите, без каких-либо значительных потерь производительности. Но для сложного приложения базы данных ситуация совершенно иная. Частые установление и закрытие соединений сильно снизят производительность системы, потому что использование соединений стало узким местом производительности системы.
Мультиплексирование соединений. За счет создания пула соединений с базой данных и набора стратегий управления использованием соединений можно эффективно и безопасно повторно использовать соединение с базой данных, избегая накладных расходов, связанных с частым установлением и закрытием соединений с базой данных.
Для общих ресурсов существует хорошо известный шаблон проектирования: пулы ресурсов. Этот режим предназначен для решения проблемы, вызванной частым выделением и освобождением ресурсов. Применение этого режима к области управления соединениями с базой данных заключается в создании пула соединений с базой данных и предоставлении набора эффективных стратегий распределения и использования соединений.Конечная цель — добиться эффективного и безопасного повторного использования соединений.
Основной принцип пула соединений с базой данных состоит в том, чтобы поддерживать определенное количество соединений с базой данных во внутреннем пуле объектов и предоставлять внешнему миру методы получения и возврата соединения с базой данных. как:
Внешние пользователи могут получить соединение с помощью метода getConnection, а затем вернуть соединение с помощью метода releaseConnection после использования.Обратите внимание, что в это время соединение не закрывается, а перезапускается диспетчером пула соединений и готово к следующему использованию.
Преимущества технологии пула соединений с базой данных:
1. Повторное использование ресурсов
Поскольку соединения с базой данных используются повторно, можно избежать большого снижения производительности, вызванного частым созданием и освобождением соединения. На основе снижения потребления системы это также повышает стабильность рабочей среды системы (уменьшает фрагментацию памяти и количество временных процессов/потоков базы данных).
2. Более высокая скорость отклика системы
В процессе инициализации пула соединений с базой данных часто создается несколько соединений с базой данных, которые помещаются в резервный пул. На этом инициализация соединения завершена. Для обработки бизнес-запросов напрямую используются существующие доступные соединения, что позволяет избежать дополнительных затрат времени на инициализацию и освобождение соединения с базой данных, тем самым сокращая общее время отклика системы.
3. новые средства распределения ресурсов
Для системы, в которой несколько приложений совместно используют одну и ту же базу данных, технология пула соединений с базой данных может быть реализована на прикладном уровне путем настройки соединений с базой данных Через несколько лет деньги могут стать новой темой. не учитывается в дизайне. Для применения пула соединений, то.... Быстро добавьте эту часть содержимого в проектный документ. Ограничение на максимальное количество подключений к базе данных, доступных приложению, чтобы предотвратить монополизацию приложением всех ресурсов базы данных.
4. Унифицированное управление соединениями для предотвращения утечек соединения с базой данных
В относительно полной реализации пула соединений с базой данных занятое соединение может быть принудительно отозвано в соответствии с настройкой тайм-аута занятости перед соединением. Это позволяет избежать возможных утечек ресурсов при обычных операциях подключения к базе данных. Минимальная реализация пула соединений с базой данных:
1. Введение
Приложение базы данных, которое часто используется во многих программных комплексах, является незаменимым помощником при разработке средних и больших систем. Однако, если ресурсы базы данных плохо управляются (например, курсор базы данных (ResultSet), Statement, Connection (Соединение) и другие ресурсы не восстанавливаются вовремя), это часто напрямую приводит к стабильности системы. Такие нестабильные факторы вызваны не только базой данных или самой системой, но постепенно выявляются только после официального использования системы и с увеличением трафика и пользователей.
В системе, разработанной на основе Java, JDBC является основным способом работы программистов с базой данных и предоставляет полный интерфейс метода работы с базой данных. Однако, учитывая применимость спецификации, JDBC обеспечивает только самую прямую спецификацию операций с базой данных.Для управления ресурсами базы данных, такими как управление и буферизация физических подключений, ожидается, что сторонний сервер приложений (сервер приложений) предоставит Это.
В этой статье, основанной на спецификации JDBC, представлен соответствующий механизм пула соединений с базой данных и представлены соответствующие методы реализации для эффективного управления ресурсами базы данных простым способом.
2. Технический фон пула соединений
2.1 JDBC
JDBC — это спецификация, следующая спецификации интерфейса JDBC.Каждый производитель базы данных реализует свой собственный драйвер, как показано на следующем рисунке:
Когда приложение получает соединение с базой данных, ему необходимо указать тип драйвера в виде URL-адреса.После получения определенного соединения оно может работать с различными типами баз данных в соответствии с фиксированным интерфейсом, например: соответственно получение заявления, выполнение SQL для получения ResultSet и т. д. Например, в следующем примере:
import java.sql.*;
…
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery("select * from demo_table");
…здесь какая-то операция с источником данных
rs.close();
st.close();
dbConn.close();
После завершения операции с данными обязательно закройте все задействованные ресурсы базы данных. Хотя это не влияет на логику приложения, это критическая операция. Выше приведен простой пример: если вы смешаете множество if-else и исключений, управление ресурсами неизбежно будет скудным. Точно так же, как проблема утечки памяти в C, системы Java также могут столкнуться с неудачей в виде сбоев. Поэтому управление ресурсами базы данных зависит от самой прикладной системы, что таит в себе скрытую опасность ненадежности и нестабильности.
2.2 Пул соединений JDBC
В стандартном интерфейсе JDBC к приложению отсутствует метод управления ресурсами. Поэтому за управление ресурсами по умолчанию отвечает само приложение. Хотя в спецификации JDBC закрытие/переработка ресурсов и другие разумные способы использования упоминаются много раз. Но самый безопасный способ — предоставить эффективные средства управления приложением. Таким образом, JDBC предоставляет стандартный интерфейс управления, реализованный производителями баз данных для сторонних серверов приложений (сервер приложений): пул соединений. Вводится понятие пула соединений (Connection Pool), то есть ресурс базы данных управляется механизмом буферного пула.
Существует три типа наиболее часто используемых ресурсов JDBC:
— Соединение: соединение с базой данных.
— Оператор: оператор сеанса.
— ResultSet: курсор набора результатов.
Существуют следующие отношения:
Поэтому роль пула соединений (Connection Pool) не только просто управляет Connection, но и включает в себя Statement и ResultSet.
2.3 Пул соединений и управление ресурсами
ConnectionPool использует механизм пула буферов для контроля и управления Connection, Statement и ResultSet в пределах определенного верхнего предела. Ресурсы любой базы данных ограничены, и если они исчерпаны, невозможно получить больше услуг данных.
В большинстве случаев исчерпание ресурсов связано не с высокой нормальной нагрузкой приложения, а с программными причинами.
В практической работе ресурсы данных часто являются узким местом, и разные приложения обращаются к одному и тому же источнику данных. Когда у одного из приложений заканчиваются ресурсы базы данных, это означает, что другие приложения не могут нормально работать. Поэтому первой задачей ConnectionPool является ограничение максимального ресурса, который может иметь каждое приложение или система. То есть определить размер пула соединений (PoolSize).
Вторая задача ConnectionPool: в пределах размера пула соединений (PoolSize) максимально использовать ресурсы и сократить цикл использования доступа к базе данных. Во многих базах данных соединение не является наименьшей единицей ресурсов, и более важно контролировать ресурсы оператора, чем соединение. Возьмите Oracle в качестве примера:
Каждое приложение для соединения (Connection) будет устанавливать соединение для связи в физической сети (такой как сеть TCP/IP), и для этого соединения также может быть применено определенное количество утверждений. Количество активных операторов, которые могут быть предоставлены одним и тем же соединением, может достигать нескольких сотен. При экономии сетевых ресурсов укорачивается цикл каждого сеанса (установление физического соединения является трудоемкой операцией). Однако в общих приложениях большинство из них работает по примеру 2.1, так что имеется 10 вызовов программы, которые будут генерировать 10 физических соединений, и каждый оператор занимает отдельное физическое соединение, что является огромной тратой ресурсов. ConnectionPool может решить эту проблему, позволяя десяткам или сотням операторов занимать только одно и то же физическое соединение, используя преимущества исходной базы данных.
Благодаря эффективному управлению ресурсами с помощью ConnectionPool общее количество операторов, доступных приложению, достигает:
(Количество одновременных физических подключений) × (Количество операторов, которые может предоставить каждое подключение)
Например, количество физических соединений, которые могут быть установлены определенной базой данных одновременно, равно 200, и каждое соединение может предоставить 250 операторов одновременно, тогда общее количество одновременных операторов, предоставляемых ConnectionPool для приложения, составляет: 200 × 250 = 50 000. Это одновременное число, и очень немногие системы превышают этот порядок величины. Итак, в начале этого раздела указано, что исчерпание ресурсов связано с непосредственным управлением приложением.
Оптимальное управление ресурсами во многом зависит от того, есть ли у базы данных собственный драйвер JDBC. Драйвер JDBC некоторых баз данных не поддерживает функцию логического соединения между Connection и Statement, например, SQLServer, нам остается только дождаться его собственной обновленной версии.
Управление применением, выпуском, восстановлением, совместным использованием и синхронизацией ресурсов является сложным и изощренным. Следовательно, еще одна функция ConnectionPool — инкапсулировать эти операции и предоставить приложениям простой интерфейс вызова, который даже не меняет стиль приложения.
3. Реализация простого пула соединений JDBC
Согласно основному механизму, описанному в главе 2, Snap-ConnectionPool (простой и быстрый инструмент для пула соединений, который можно загрузить в Интернете) реализует функцию эффективного управления ресурсами базы данных, которые имеет пул соединений в соответствии с некоторыми спецификациями JDBC.
3.1 Описание системы
В спецификации JDBC приложения напрямую обращаются к ресурсам базы данных через интерфейс драйвера. Для эффективного и разумного управления ресурсами между приложением и драйвером JDBC добавляется пул соединений: Snap-ConnectionPool. А благодаря объектно-ориентированному механизму большинство операций пула соединений прозрачны. См. рисунок ниже, система Snap-ConnectionPool:
Как показано на рисунке, путем реализации некоторых интерфейсов объектов ресурсов JDBC (Connection, Statement, ResultSet) внутри Snap-ConnectionPool генерируются три логических объекта ресурсов: PooledConnection, PooledStatement и PooledResultSet. Они также являются основными объектами операций управления пулом соединений и наследуют соответствующую принадлежность в JDBC. Такая система имеет следующие характеристики:
— Прозрачность. Предоставляет службы управления ресурсами без изменения исходного интерфейса драйвера JDBC приложения. Система приложений, как и оригинальный JDBC, использует ресурсы логических объектов, предоставляемые пулом соединений. Упрощенное преобразование пула соединений приложений.
- Инкапсуляция ресурсов. Комплексное управление ресурсами инкапсулировано внутри Snap-ConnectionPool, что не требует слишком большого вмешательства со стороны прикладной системы. Надежность и безопасность операций управления гарантируется пулом соединений. Вмешательство приложения (например, активное отключение ресурсов) играет роль только в оптимизации производительности системы, и пропуск операций не будет иметь негативных последствий.
- Рациональное использование ресурсов. По принадлежности ресурсов в JDBC Snap-ConnectionPool не только буферизует Connection, но и имеет соответствующий механизм для Statement. Как описано в 2.3, рациональное использование отношения между Connection и Statement может максимизировать использование ресурсов. Таким образом, Snap-ConnectionPool инкапсулирует ресурсы Connection и предоставляет больше ресурсов Statement для системы приложений за счет внутреннего управления PooledConnection.
- Управление цепочками ресурсов. Три логических объекта, содержащиеся в Snap-ConnectionPool, наследуют принадлежность между соответствующими объектами в JDBC. Во внутреннем управлении управление цепью также осуществляется по отношениям подчиненности. Например, оценка времени ожидания подключения зависит от того, активна ли содержащаяся инструкция; оценка инструкции также зависит от активности ResultSet.
3.2 Централизованное управление пулом соединений ConnectionManager
ConnectionPool — это объект пула соединений Snap-ConnectionPool. Внутри Snap-ConnectionPool для служб приложений можно указать несколько различных пулов соединений (ConnectionPools). ConnectionManager управляет всеми пулами соединений, и каждый пул соединений отличается своим именем. Адаптируйтесь к различным типам баз данных с помощью файлов конфигурации. Как показано ниже:
С помощью ConnectionManager вы можете одновременно управлять несколькими различными пулами соединений, предоставляя единый интерфейс управления. В прикладной системе с помощью ConnectionManager и связанных файлов конфигурации информация о конфигурации базы данных (включая: имя базы данных, пользователя, пароль и т. д.), разбросанная по соответствующим прикладным программам, может быть сосредоточена в одном файле. Облегчение обслуживания системы.
3.3 Пример использования пула соединений
Для стандартного примера использования JDBC 2.1 вместо этого используется пул соединений, и результаты следующие:
import java.sql.*;
import net.snapbug.util.dbtool.*;
…
..ConnectionPool dbConn = ConnectionManager
.getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
"выбрать * из demo_table" );
…
some data source operation
in herers.close();st.close();
В этом примере Snap-ConnectionPool инкапсулирует управление приложением Connection. Пока метод получения соединения JDBC изменен, другие операции с данными можно оставить без изменений, чтобы получить пул соединений (выделено жирным шрифтом). Таким образом, Snap-ConnectionPool помогает приложениям эффективно управлять ресурсами базы данных. Если приложение игнорирует последний выпуск ресурсов: rs.close() и st.close(), пул соединений автоматически перезапустится через механизм тайм-аута (time-out).
4. Резюме
Будь то Snap-ConnectionPool или другие пулы соединений с базой данных, он должен иметь следующие основные функции:
- Защита ресурсов исходной базы данных
- В полной мере использовать эффективные ресурсы базы данных
- Упростить интерфейс базы данных приложения и закрыть управление ресурсами.
-Автоматическая переработка и сортировка устаревших ресурсов приложений для улучшения повторного использования ресурсов.
В соответствии с этой предпосылкой приложения могут уделять больше внимания своей соответствующей бизнес-логике. Ресурсы базы данных больше не являются узким местом системы.