17:数据库连接池与Servlet整合-Java Web

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 17:数据库连接池与Servlet整合-Java Web

在构建高性能的Java Web应用程序时,有效地管理和复用数据库连接是至关重要的。本文将深入探讨如何利用数据库连接池技术以及Servlet来优化数据库操作,并通过实例代码展示前后端协作的全过程。同时,我们还将分析两者之间的关键区别和适用场景,助您掌握这一核心技术栈在实际项目中的运用。

17.1 引言

数据库连接作为Web应用与数据库交互的关键资源,在频繁的操作中直接创建和销毁连接会导致性能瓶颈和资源浪费。因此,数据库连接池作为一种高效的资源管理策略应运而生,它能够在多线程环境下预先建立并缓存一定数量的数据库连接,按需分配给应用程序使用,从而显著提高系统性能和响应速度。

17.2 数据库连接池原理及实现

我们将以广泛应用的Apache Commons DBCP为例,介绍如何配置和初始化一个数据库连接池。首先,需要在项目的配置文件中设置数据库连接的相关属性,如驱动类名、URL、用户名、密码等。然后,通过DBCP提供的BasicDataSource类获取连接,而不是传统的DriverManager.getConnection()方式。

import org.apache.commons.dbcp2.BasicDataSource;
// 初始化连接池
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("username");
ds.setPassword("password");
// 从连接池获取数据库连接
Connection conn = ds.getConnection();

17.3 Servlet实现数据库操作

在Servlet中,我们可以结合数据库连接池完成对数据库的各种CRUD操作。以下是一个简单的Servlet示例,用于查询数据库中的数据:

@WebServlet("/query")
public class QueryServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try (Connection conn = ds.getConnection()) { // 从连接池获取连接
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM users");
            
            while (rs.next()) {
                String username = rs.getString("username");
                // 将结果输出到页面或处理其他业务逻辑...
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            // 处理异常
        }
    }
}

17.4 数据库连接池与直连的区别总结

  • 直接连接(每次请求创建新连接):资源消耗大,性能低,易造成数据库连接数超出限制。
  • 数据库连接池:预先创建并缓存连接,避免了频繁创建和关闭连接带来的开销,提高了系统并发能力。

17.5 数据库连接池的详细配置与优化

Apache Commons DBCP提供的BasicDataSource类提供了丰富的配置选项以适应不同的应用场景,例如:

  1. 最大连接数(maxTotal):指定连接池中可以同时存在的最大连接数量。设置过大可能导致资源浪费,过小则可能在高并发下导致“无可用连接”异常。
ds.setMaxTotal(50); // 设置最大连接数为50
  1. 最小空闲连接数(minIdle):即使没有活动连接请求,连接池也会确保至少有这么多连接处于空闲状态。
ds.setMinIdle(10); // 设置最小空闲连接数为10
  1. 测试连接有效性的SQL语句(validationQuery):定期检查并验证连接是否仍然有效,防止使用已断开的连接。
ds.setValidationQuery("SELECT 1"); // MySQL中的简单验证查询
ds.setTestWhileIdle(true); // 在空闲时进行测试
ds.setTimeBetweenEvictionRunsMillis(60000); // 每60秒执行一次连接有效性检测
  1. 超时参数
  • maxWaitMillis:当连接池耗尽时,客户端等待获取连接的最大时间。
  • removeAbandonedTimeout:废弃连接的超时时间,超过此时间未被使用的连接将被回收。
ds.setMaxWaitMillis(30000); // 设置等待连接的最大时间为30秒
ds.setRemoveAbandonedOnBorrow(true); // 当借用连接时,发现其已经废弃则移除
ds.setRemoveAbandonedTimeout(600); // 设置废弃连接的时间阈值为60秒

17.6 Servlet结合JDBC操作数据库的进阶实践

为了更好地组织和复用代码,可以创建一个抽象的DAO层,封装数据库操作方法,并在Servlet中调用:

public abstract class AbstractDao {
    protected Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    
    public List<User> getAllUsers() throws SQLException {
        try (Connection conn = getConnection()) {
            // 使用PreparedStatement避免SQL注入
            String sql = "SELECT * FROM users";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            
            List<User> userList = new ArrayList<>();
            while (rs.next()) {
                User user = new User(rs.getInt("id"), rs.getString("username"));
                userList.add(user);
            }
            return userList;
        }
    }
}
@WebServlet("/users")
public class UsersServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private AbstractDao userDao = new UserDao();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            List<User> users = userDao.getAllUsers();
            // 将用户列表转换为JSON格式输出或填充到HTML模板中
        } catch (SQLException e) {
            // 处理数据库操作异常
        }
    }
}

17.7 Spring框架下的数据库连接池与数据库操作

在Spring Boot项目中,无需手动配置连接池,只需在application.properties中添加相应配置即可自动启用HikariCP、Tomcat JDBC Pool等高性能连接池,并通过JdbcTemplate或ORM框架如Hibernate简化数据库操作。

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

然后,在Service或Repository层中注入JdbcTemplate,利用其提供的便捷方法执行SQL操作。

@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("username")));
    }
}

17.8 应用场景总结

数据库连接池广泛应用于高并发、大数据量的Web应用中,包括但不限于电子商务网站、社交平台、企业级管理系统等,尤其在微服务架构下,每个服务内部通常都会维护自己的数据库连接池,以保证服务的稳定性和响应速度。

随着Spring框架的发展,如今更推荐使用Spring Boot的数据源自动配置和JdbcTemplate/Hibernate等ORM工具进行数据库操作,它们不仅封装了连接池的使用,还简化了SQL语句的编写与执行流程,进一步提升了开发效率和代码可读性。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
15天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
46 15
|
14天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
32 0
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
35 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
25 1
|
1月前
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
29 0
数据库的连接用Java
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
138 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
1月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
26 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践