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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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语句的编写与执行流程,进一步提升了开发效率和代码可读性。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于web的铁路订票管理系统
计算机Java项目|基于web的铁路订票管理系统
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
6天前
|
传感器 小程序 搜索推荐
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
通过电子班牌设备和智慧校园数据平台的统一管理,在电子班牌上,班牌展示、学生上课刷卡考勤、考勤状况汇总展示,课表展示,考场管理,请假管理,成绩查询,考试优秀标兵展示、校园通知展示,班级文化各片展示等多种化展示。
31 0
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
|
1天前
|
关系型数据库 MySQL API
实时计算 Flink版操作报错合集之同步MySQL数据到另一个MySQL数据库,第一次同步后源表数据发生变化时目标表没有相应更新,且Web UI中看不到运行的任务,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的电子产品销售系统设计与实现
计算机Java项目|基于Web的电子产品销售系统设计与实现
|
4天前
|
前端开发 JavaScript Java
计算机java项目|基于web的多媒体素材管理系统
计算机java项目|基于web的多媒体素材管理系统
|
5天前
|
druid Java 关系型数据库
JAVA *数据库连接池 * 接JDBC
JAVA *数据库连接池 * 接JDBC
|
10天前
|
Java
Java web Filter过滤器
一、什么是Filter过滤器 它是java web的三大组件之一,三大组件分别为:servlet、filter、listener; 它的作用主要是用于拦截请求,过滤响应;拦截请求常见的应用场景有日记记录,权限校验。。。
15 3
|
12天前
|
Java
Java Socket编程 - 获取WEB站点主页信息
Java Socket编程 - 获取WEB站点主页信息
8 0
|
13天前
|
存储 SQL 缓存
Java性能优化(十)-数据库调优-数据库参数设置优化
Java性能优化(十)-数据库调优-数据库参数设置优化
15 0

热门文章

最新文章