使用数据库连接池来快速访问数据库Druid

使用数据库连接池来快速访问数据库Druid

  • 简介
    • 为什么使用连接池
    • 原理及使用连接池访问数据库的优势
    • 开源项目 alibaba/druid 地址
  • 使用方法
    • 准备jar包
    • 定义Druid的配置文件
  • 代码示例

简介

数据库连接池是一个容器,负责分配、管理数据库的连接(Connection)。通过连接池可以让应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,从而节省了大量时间。连接池还会释放空闲时间超过指定最大时长的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。
连接池的好处主要有三:

  • 资源复用
  • 提升系统响应速度
  • 防止数据库连接泄露

为什么使用连接池

使用JDBC连接数据库时,都需要创建一个Connection对象,使用完毕后需要再将其销毁。而这种创建、销毁、再创建、再销毁的重复过程会特别耗费计算机性能以及程序运行时长。而数据库如果使用了数据库连接池,就能达到Connection对象的复用效果。

原理及使用连接池访问数据库的优势

数据库连接池在一开始就创建好了一些【数据库连接对象】存储起来。用户需要连接数据库时,不需要自己创建连接,只需要从连接池中获取一个进行使用就行了,使用完毕后将连接对象归还给连接池,由此实现了资源重用(自认指connection的创建和销毁),并节省了数据库连接的频繁创建、销毁所花费的时间,从而提高系统响应的速度。
使用数据库连接池来快速访问数据库Druid_第1张图片

开源项目 alibaba/druid 地址

此处给出alibaba/druid的GitHub地址https://github.com/alibaba/druid。

使用方法

准备jar包

注意,使用Druid数据库连接池来实现数据库访问时,不仅需要druid的jar包,还需要对应数据库的访问jar包(否则会报错“java.sql.SQLException: com.mysql.cj.jdbc.Driver”)

此处先给出1.2.18版本druid的maven坐标。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.18</version>
</dependency>

定义Druid的配置文件

数据库驱动的名称driverClassName与直接使用JDBC jar包访问数据库时使用的名称一致。

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useServerPrepStmts=true
username=root
password=
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

代码示例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class MySqlDatabaseConnectorUsingDruid {

	String currentFolder;
	Properties properties;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MySqlDatabaseConnectorUsingDruid druid = new MySqlDatabaseConnectorUsingDruid();
		druid.getDataFromMysql("");
	}

	private void getDataFromMysql(String sqlString) {
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		if (sqlString.isBlank()) {
			sqlString = "select * from hogwarts_user;";
		}
		try {
			properties.load(new FileInputStream(currentFolder+File.separator+"src"+File.separator+"main"+File.separator+"java"+File.separator+"druid.properties"));
			//工厂模式获取连接池对象,通过读取properties中预定义的Druid属性来设置连接池,DataSource本身就没有提供构造方法。
			DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
			//从连接池中获取数据库连接Connection,从而减少新建Connection对象(connection = DriverManager.getConnection(DB_URL, "root", "");打开数据库链接)的时间
			connection = dataSource.getConnection();
			if (connection!=null) {
				statement = connection.createStatement();
				resultSet = statement.executeQuery(sqlString);
			}
			
			while (resultSet.next()) {
				String id = resultSet.getString("id");
				String nameString = resultSet.getString("name");
				String ageString = resultSet.getString("age");
						
				System.out.print("id是"+id);
				System.out.print(",name是"+nameString);
				System.out.println(",age是"+ageString);
				System.out.println("---------------");
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if (resultSet!=null) {
				try {
					resultSet.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (statement!=null) {
				try {
					statement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (connection!=null) {
				try {
					//只是将数据库连接池中占用的connection释放掉,使connection在连接池中处于空闲状态。网上有博客做过实验,可以参考[此博客](https://blog.csdn.net/killbibi/article/details/121364941)
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		
	}
	
	public MySqlDatabaseConnectorUsingDruid() {
		// TODO Auto-generated constructor stub
		currentFolder = System.getProperty("user.dir");
		properties = new Properties();
	}
}

你可能感兴趣的:(数据库,数据库,mysql,java,Druid)