一 传统连接方式
首先调用Class.forName()方法加载数据库驱动,然后调用DriverManager.getConnection()方法建立连接.
二 连接池方式
连接池解决方案是在应用程序启动时就预先建立多个数据库连接对象,然后将连接对象保存到连接池中。当客户请求到来时,从池中取出一个连接对象为客户服务。当请求完成时,客户程序调用close()方法,将连接对象放回池中.对于多于连接池中连接数的请求,排队等待。应用程序还可根据连接池中连接的使用率,动态增加或减少池中的连接数。
三 传统方式存在问题
Connection对象在每次执行DML和DQL的过程中都要创建一次,DML和DQL执行完毕后,connection对象都会被销毁. connection对象是可以反复使用的,没有必要每次都创建新的.该对象的创建和销毁都是比较消耗系统资源的,如何实现connection对象的反复使用呢?使用连接池技术实现.
四 连接池的优势
- 预先准备一些链接对象,放入连接池中,当多个线程并发执行时,可以避免短时间内一次性大量创建链接对象,减少计算机单位时间内的运算压力,提高程序的响应速度
- 实现链接对象的反复使用,可以大大减少链接对象的创建次数,减少资源的消耗
- 具体实现如下
五 定义连接池
package com.yqq.dao;
import lombok.SneakyThrows;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/10/02/17:14
* @Description:
*/
public class ConnectionPool {
private static String driver = "com.mysql.cj.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/student";
private static String user = "root";
private static String password = "root";
private static int initSize = 5;
private static int maxSize = 10;
private static LinkedList<Connection> pool;
static {
try {
//加载驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//初始化pool
pool = new LinkedList<Connection>();
//创建5个连接对象
for (int i = 0; i < initSize; i++) {
Connection con = initConnection();
pool.add(con);
}
}
@SneakyThrows
private static Connection initConnection(){
return DriverManager.getConnection(url,user,password);
}
//公有的给外界提供连接对象
public static Connection getConnection(){
Connection connection = null;
if (pool.size() > 0)
//移除集合中的第一个元素
connection = pool.remove();
else
connection = initConnection();
return connection;
}
//公有的向连接池归还连接对象的方法
@SneakyThrows
public static void returnConnection(Connection connection){
if (pool.size() < 10)
pool.addLast(connection);
else
connection.close();
}
}