1. Что такое пул соединений JDBC?
В традиционных соединениях JDBC каждый раз, когда вы получаете соединение подключение, вам необходимо загрузить какой -то сложный код, например, следующий код:
public Static Connection getConn () {Connection conn = null; String url = "jdbc: mysql: // localhost: 3306/test"; String user = "root"; String password = "root"; try {class.forname ("com.mysql.jdbc.driver"); conn = drivermanager.getConnection (URL, пользователь, пароль); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; }Такие сложные операции предназначены только для получения соединения. Конечно, мы можем инкапсулировать его в класс инструментов для доступа (приведенная выше рисунок инкапсулирует соединение соединения), но является ли это пустой тратой производительности для загрузки каждого соединения? Чтобы оптимизировать производительность, появляется пул соединений.
Когда пул соединений инициализируется, для нас создается несколько соединений. Когда нам нужно подключиться, нам нужно только получить существующие подключения из пула соединений. Когда не будет инициализированных соединений, будет воссоздано соединение. После использования соединения соединение не будет уничтожено, но будет возвращено в пул соединений для последующего использования. (Конечно, объединение - это не просто простое, вот вступления)
Обычно используемые пулы соединений включают DBCP и C3P0. Наиболее основными сейчас являются пул подключений Alibaba Druid и собственный пул соединений JNDI от Tomcat.
2. Настройте простой пул соединений
Анализ пользовательских пулов соединений:
1.2. Поскольку это пул соединений, нам необходимо реализовать интерфейс данных и реализовать методы в нем. Основываясь на нашей ситуации, мы о методе GetConnection ();
2. Поскольку мы хотим хранить несколько объектов подключения, мы используем коллекцию для ее хранения. На основании частых операций добавления и удаления, затем используйте LinkedList;
3. Разрушение соединения состоит не в том, чтобы уничтожить соединение, а для возврата соединения в пул соединений.
Кодирование:
1. Создайте класс MyDatasource и реализуйте интерфейс DataSource
Когда этот класс загружен, он должен иметь контейнер для хранения соединения, поэтому определите статическое свойство:
Частный статический список <nectament> connectist = new LinkedList <> ();
2. Поскольку нам нужно получить подключение к базе данных, мы инкапсулируем метод для получения подключения к базе данных.
public Connection getOneConnection () {connection conn = null; Try {// Полученные здесь данные получены через внешний файл свойств, который является более гибким. InputStream in = myDatasource.class.getClassloader (). getResourCeasStream ("jdbc/jdbc.properties"); Свойства Pro = новые свойства (); pro.load (in); Driver = Pro.GetProperty ("Driver"); url = pro.getProperty ("url"); username = pro.getProperty («Пользователь»); пароль = pro.getProperty ("пароль"); Class.forname (драйвер); conn = drivermanager.getConnection (URL, имя пользователя, пароль); } catch (Exception e) {e.getStackTrace (); } return conn; }Обратите внимание, что данные, которые я получил через файл свойств, могут быть выбраны в соответствии с фактической ситуацией.
3. Инициализируйте несколько соединений и положите их в контейнер. Он может быть реализован с использованием статических кодовых блоков, но если этот источник данных не используется, он вызовет отходы ресурсов, поэтому я рассмотрел вопрос о внедрении инициализации нескольких соединений в его конструктор, то есть, когда этот пул соединений будет необходим, он будет создавать несколько соединений соответственно. следующее:
public mydatasource () {for (int i = 0; i <5; i ++) {connection conn = getOneConnection (); // вызовать метод для создания connectionList.add (conn); }}4. Теперь начните перезаписать внешний метод для GetConnection (), чтобы получить соединение из этого пула соединений
@Override public Connection getConnection () Throws SQLexception {connection conn = null; if (connectist == null || connectist.size () <= 0) {connection connection = getConnection (); connectist.add (соединение); } conn = connectistlist.remove (0); вернуть Конн; }5. Создайте метод возврата объекта, поместите используемое соединение в пул соединений
public void BackConnection (Connection conn) {connectist.add (conn); }Хорошо, это завершает простой пользовательский пул соединений, и тестовый код выглядит следующим образом:
public static void main (string [] args) выбрасывает SQLexception {myDataSource dataSource = new myDataSource (); Соединение conn = dataSource.getConnection (); String sql = "select * из пользователя, где u_id =?"; Подготовленное предприятие PS = NULL; Результат RS = NULL; try {ps = conn.preprestatement (sql); ps.setint (1, 1); rs = ps.executequery (); while (rs.next ()) {System.out.println ("id ="+rs.getint (1)); System.out.println ("username ="+rs.getString (2)); System.out.println ("password ="+rs.getString (3)); }} catch (sqlexception e) {e.printstacktrace (); } наконец {dataSource.backConnection (conn); }}Поскольку в моем коде нет никаких других двух объектов, чтобы закрыть.
Теперь существует небольшая проблема, что наше закрывающее соединение достигается с помощью метода пула соединений. Однако, если пользователь вызывает метод закрытия объекта соединения, соединение разрушается и не возвращается в пул соединений. Затем мы оптимизируем его так, чтобы пользователь не разрушил соединение, но возвращал соединение.
Среди них есть много решений, и вот декоративная модель.
Оптимизация:
1. Создайте новый класс MyConnection для реализации интерфейса соединения, где его типы атрибутов - Connection Conn и A Liis <Neply>.
частное соединение Conn; Частный список <necection> Pool; public myConnection (соединение conn, list <necect> pool) {this.conn = conn; this.pool = pool; }2. Затем реализуйте метод закрытия интерфейса
@Override public void cloid () Throws SQLexception {System.out.println ("Recycle Connection"); pool.add (conn); }3. Затем реализуйте метод получения оператора. Если он не реализован, то при получении этого оператора возникнет ошибка нулевого указателя. Я только реализую метод получения подготовленного предприятия.
@Override publicStatement PrepareStatement (String SQL) Throws SQLexception {System.out.println ("GET оператор"); вернуть conn.preparestatement (SQL); }4. Затем удалите метод обратной связи класса MyDataSource, чтобы вернуть соединение, и изменить конструктор и метод для получения соединения следующим образом
public myDataSource2 () {for (int i = 0; i <5; i ++) {connection conn = getOneConnection (); MyConnection myConn = новый myConnection (conn, connectistlist); connectist.add (myconn); }} @Override public Connection getConnection () Throws SQLexception {connection conn = null; if (connectist == null || connectist.size () <= 0) {connection connection = getConnection (); MyConnection myConn = новый myConnection (ConnectionList); connectist.add (myconn); } conn = connectistlist.remove (0); вернуть Конн; }ОК, чтобы пользователь не уничтожил соединение, вызывая наше метод Connect Close напрямую, и правильно вернет его в пул соединений. Вы можете проверить его, внесет небольшую модификацию в тестовом коде.
Приведенная выше статья - весь контент, которым я поделился с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.