JDBC—连接池

为什么需要使用数据库连接池

  • 普通的JDBC数据库连接(Connection对象) 使用 DriverManger 获取,每次向数据库建立连接的时候都要将 Connection 加载到内存,在验证用户名和密码(得花费0.05S-1S的时间) ----> 建立JDBC连接得开销是很大的

  • 需要数据库连接的时候,就向数据库获取一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

  • 对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。

  • 这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.

 

连接池

连接池图解

连接池

连接池中的Connection对象 预先存在吗?

  • 应用启动成功之后,就在连接池中预先存储5个Connection对象,就像你去火车站买票,是你去了火车站就有卖票窗口,还是去了火车站给你现场搭建卖票窗口

初始连接数:

  • 你去火车站买票时,卖票窗口就已经存在了。

最大连接数:

  • 春运期间,去火车站买票的人很多,既有的窗口已经无法满足买票需求,就会新增窗口,但是新增窗口是有上限的,并不是无限新增,设置最多新增数20,即同时最多只能有20个窗口卖票。
  • 连接池初始化时只有5个连接对象,将最大连接数设置为20个。当5个客户端 占有了5个连接对时,连接池中就没有连接对象了,这时第6个客户端,第7个客户端来获取连接对象时,就会在为它们新增2个连接对象,但是最多只能有20个

最小连接数:

  • 在不是旅游高峰期和春运时,买票人不是很多,尤其是在凌晨时,没有必要开5个卖票窗口,这时可以关闭3个窗口。只留下两个窗口

最大等待时间:

  • 当20个连接对象都被占有时,设置一个最大等待时间,如果过了最大等待时间,则提示系统繁忙

最大连接时间 :

  • 避免占着茅坑不拉屎情况,如果20个 连接对象都被获取,而这20个连接一直什么都不做,也不归还连接对象,这样后边的客户端将陷入无须等待

连接池得最大好处:重复利用了每一个Connection对象,节省了性能开销

连接池概述

在Java中,使用 javax.sql.DataSource 接口来表示连接池/数据源

注意:DataSource 和 JDBC 一样仅仅是一个接口,由各大服务器厂商来实现

常用的DataSource 的实现

  • C3P0:Hibernate 推荐,但是该连接池在07年之后就不在更新了,不建议使用:性能差
  • DBCP:Apache 组织的项目,Spring推荐
  • Druid::阿里巴巴的项目(又称德鲁伊),号称宇宙第一强,性能超群,世界上最好的连接池

使用连接池和不使用连接池的区别在哪里?

  • 如何获取连接对象
    • 没有使用连接池则通过DriverManager 来获取,直接从DBMS 连接
    • 使用连接池则直接通过连接池获取 (DataSource对象.getConnection())
  • 释放连接对象
    • 没有连接池:conn.close()直接和数据库服务器断开连接
    • 存在连接池:conn.close()是把Connection对象归还给连接池,并没有断开与数据库服务器的连接

不同的连接池创建DataSource 对象的方法和配置不一样,操作连接池最重要的是如何获取DataSource对象

连接池的详细使用

### JDBC连接池的实现与配置 JDBC连接池是一种用于优化数据库操作的技术,它通过预先创建一组数据库连接并将它们保存在内存中来减少频繁创建和销毁连接带来的性能开销。以下是关于几种常见的JDBC连接池及其配置方法。 #### Druid连接池 Druid是由阿里巴巴开发的一个高性能的数据库连接池。它的配置可以通过简单的属性设置完成。下面是一个基于Druid连接池的基本配置示例: ```java import com.alibaba.druid.pool.DruidDataSource; public class DruidConfig { public static void main(String[] args) throws Exception { DruidDataSource dataSource = new DruidDataSource(); // 设置基本属性 dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("root"); dataSource.setPassword("password"); // 可选:设置初始化连接数、最小/最大活跃连接数等 dataSource.setInitialSize(5); dataSource.setMaxActive(20); dataSource.setMinIdle(5); // 获取连接 try (var connection = dataSource.getConnection()) { System.out.println("Connection acquired successfully."); } } } ``` 上述代码展示了如何使用Druid连接池,并设置了几个重要的参数[^1]。 #### C3P0连接池 C3P0也是一个广泛使用的开源JDBC连接池解决方案。其配置通常通过`c3p0-config.xml`文件或者直接在代码中设定属性来进行。 以下是一个简单的C3P0配置实例: ```xml <c3p0-config> <default-config> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb</property> <property name="user">root</property> <property name="password">password</property> <!-- 连接池相关配置 --> <property name="initialPoolSize">5</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> </c3p0-config> ``` 此XML片段定义了一个默认的C3P0配置,其中包含了驱动程序类名、URL以及其他必要的连接细节[^2]。 #### Tomcat JNDI 数据源 Tomcat支持通过JNDI服务提供数据源管理功能。这种方式允许开发者将数据库连接池的相关配置放在服务器端而非应用层,从而简化部署过程并增强安全性。 要在Tomcat中启用JNDI数据源,需修改`context.xml`文件如下所示: ```xml <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" maxWaitMillis="10000" username="root" password="password" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/testdb"/> ``` 随后,在Web应用程序中可通过以下方式获取该资源: ```java Context initCtx = new InitialContext(); Context envCtx = (Context)initCtx.lookup("java:/comp/env"); DataSource ds = (DataSource)envCtx.lookup("jdbc/TestDB"); try (Connection conn = ds.getConnection()) { System.out.println("Connected via JNDI!"); } ``` 这段代码说明了如何利用Tomcat内置的支持从环境中查找预定义的数据源[^4]。 --- ### 总结 无论是采用独立库如DruidC3P0还是依赖于容器环境下的Tomcat JNDI接口,合理地配置和运用这些技术都可以显著提升系统的效率与稳定性。每种方案都有各自的特点及适用场景,因此选择合适的工具对于实际项目至关重要[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值