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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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
目录
相关文章
|
1月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
51 2
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
57 15
|
2月前
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
54 0
数据库的连接用Java
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
191 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
38 0
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
41 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
42 1
|
4月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
238 0
|
4月前
|
Java Maven Android开发
解锁Web开发新技能:从零开始的Struts 2之旅——让你的Java编程之路更加宽广,首个应用实例带你飞!
【8月更文挑战第31天】对于初学者,掌握 Struts 2 框架不仅能提升 Web 开发能力,还能深入了解 MVC 架构。Struts 2 是一个基于 Servlet 的 Java 框架,提供表单验证、文件上传、国际化等功能,便于快速构建易维护的 Web 应用。本文通过示例演示如何从零开始搭建环境并创建一个简单的 Struts 2 项目,包括配置 `struts.xml`、编写 Action 类及视图文件,并配置 web.xml。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
66 0
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
79 0