数据库连接池的使用 - Druid(德鲁伊)

本文介绍了数据库连接池的概念,强调了其在提升数据库操作性能中的作用。讲解了如何自定义数据库连接池,包括单例模式实现、连接池属性、自动初始化和增长、获取与归还连接的方法。接着,重点讨论了常见的数据库连接池,如C3P0、DBCP和Druid,特别提到了Druid的监控和配置特性。最后,提到了BaseDAO的开发,以封装数据库操作。
摘要由CSDN通过智能技术生成

1、数据库连接池

1.1概念

教学视频,点击进入

​ 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

面试题:什么是数据库连接池?

目前的数据库连接做法:

​ 需要链接数据就马上创建一个连接,使用完成之后,就将连接关闭了。下次使用在创建。。。。。。

​ 实际上数据库的链接操作是比较耗费资源的。如果可以不频繁的创建和关闭连接,可以大幅度的提高效率。

白话数据库连接池:

​ 我们预先创建好一部分连接,放在一个池中(集合),并且将这些连接标记为空闲状态。如果要使用连接就从池中获取一个连接使用,用完之后再次还回池中。

​ 连接池自己应该有自动初始化功能,自动增长功能,自动缩减功能。

​ 所谓自动增长就是当池中的连接都被使用之后,自动创建新的连接放入池中。

​ 所谓自动缩减就是当池中的空闲连接过多时,自动关闭部分连接。

1.2自定义数据库连接池

创建一个类ConnectionPool作为连接池对象。

[1]连接池只能有一个,所以连接池对象应该是单利的。

	//提供静态的私有的本类对象
	private static ConnectionPool pool;
	//构造方法私有化
	private ConnectionPool() {
   
			init();//在构造方法中初始化连接池
	}
	//提供静态的可以获取本类对象的方法。
	public synchronized static ConnectionPool getPool() {
   
		if(pool==null)
			pool = new ConnectionPool();
		return pool;
	};

[2]连接池中的属性

	//成员属性
	//数据库连接属性
	private static String driverClass;
	private static String userName;
	private static String url;
	private static String password;
	//初始连接数量
	private static int initCount = 5;
	//最小连接数量
	private static int minCount = 5;
	//最大连接数量
	private static int maxCount = 15;
	//当前的连接数量
	private static int count;
	//使用集合存储连接
	LinkedList<Connection> conns = new LinkedList<Connection>();

	//成员属性初始化
	static {
   
		Properties properties = new Properties();
		try {
   
			properties.load(ConnectionPool.class.getClassLoader().getResourceAsStream("db.properties"));
			driverClass = properties.getProperty("jdbc.driverclass");
			url  = properties.getProperty("jdbc.url");
			userName = properties.getProperty("jdbc.username");
			password = properties.getProperty("jdbc.password");
			try {
   
				initCount = new Integer(properties.getProperty("jdbc.initCount"));
			} catch (NumberFormatException e) {
   
				System.out.println("initCount使用默认值:"+initCount);
			}
			try {
   
				minCount = new Integer(properties.getProperty("jdbc.minCount"));
			} catch (NumberFormatException e) {
   
				System.out.println("minCount使用默认值:"+minCount);
			}
			try {
   
				maxCount = new Integer(properties.getProperty("jdbc.maxCount"));
			} catch (NumberFormatException e) {
   
				System.out.println("maxCount使用默认值:"+maxCount);
			}
		} catch (IOException e) {
   
			e.printStackTrace();
		}
	}

不要忘记添加db.properties

jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.30.21:3306/student?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=1998528Xk
jdbc.initCount=8
jdbc.minCount=8
jdbc.maxCount=20

[3]自动初始化的功能

	/**
	 * 初始化连接池
	 */
	private void init() {
   
		// 循环的给集合中添加初始化个数个链接
		for (int i = 0; i < initCount; i++) {
   
			boolean flag = conns.add(createCon());
			if(flag) {
   
				//添加成功之后就将给连接数量+1
				count ++;
			}
		}
		System.out.println("连接池初始化完成");
	}
	/**
	 * 创建一个可用的数据库连接
	 * @return
	 */
	private Connection createCon() {
   
		try {
   
			Class.forName(driverClass);
			return DriverManager.getConnection(url, userName, password);
		} catch (Exception e) {
   
			throw new RuntimeException("链接创建失败:"+e.getMessage());
		}
	}

[4]完成自动增长功能

	/**
	 * 池中连接自动增长
	 */
	private <
数据库连接池是一种用于管理数据库连接的技术,它通过预先创建一定数量的数据库连接并保存在连接池中,当应用程序需要与数据库进行交互时,直接从连接池中获取连接,而不需要每次都创建和销毁连接,从而减少了连接的创建和销毁开销,提高了系统的响应速度和性能。 Druid德鲁伊连接池是一个开源的Java数据库连接池,与传统的连接池相比具有更高的性能和更丰富的功能。使用Druid连接池可以帮助开发人员更好地管理数据库连接,提高系统的并发能力和稳定性。 在使用Druid连接池时,首先需要在应用的配置文件中配置Druid连接池的参数,包括数据库的连接URL、用户名和密码等信息。然后,在应用程序中引入Druid连接池的相关类库和配置文件。 接下来,通过Druid提供的DataSource类来获取数据库连接。DataSource是连接池的核心类,它可以根据配置参数创建数据库连接,并提供对连接的获取、释放和管理等功能。 在实际使用中,通过调用DataSource的getConnection方法可以获得一个数据库连接对象,然后可以使用该连接对象执行SQL语句,并获取查询结果。在使用连接后,需要调用Connection的close方法将连接返回给连接池,以便其他请求可以继续使用Druid连接池还提供了一些高级功能,如连接池的监控和统计、连接泄漏检测等。可以通过配置监控统计的参数,实时查看连接池使用情况和性能指标,从而及时发现和解决连接池相关的问题。 综上所述,Druid连接池是一个强大、高效的开源数据库连接池,能够有效地管理和复用数据库连接,提高系统的性能和稳定性,是开发中常用的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值