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
目录
相关文章
|
11天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
17天前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
19 1
|
10天前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
25 0
|
15天前
|
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。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
27 0
|
15天前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
25 0
|
15天前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
26 0
|
15天前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
26 0
|
15天前
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
38 0
|
17天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
14 0
|
14天前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
33 1