DBCP数据库连接池以及在Tomcat中配置JNDI数据源

news2024/11/19 23:34:35

前言

  • 数据库连接
    • 数据库连接是指在计算机系统中建立起应用程序与数据库之间的连接通道,用于进行数据的读取和写入操作。通过数据库连接,应用程序可以与数据库进行交互,执行各种数据库操作,如查询数据、插入数据、更新数据和删除数据等。数据库连接通常包括数据库的地址、端口、用户名、密码等信息,用于验证应用程序的身份并建立与数据库的连接。
  • 数据库连接池
    • 数据库连接池(Connection Pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理。程序动态地对池中的连接进行申请、使用和释放。这样可以避免频繁的创建和释放连接带来的性能开销,并减少内存碎片。数据库连接池初始化时,已经创建多个数据库连接置于池中备用,当应用程序需要访问数据库时,它会向连接池请求一个连接,使用完毕后再将连接归还给连接池。
  • 数据源
    • 由JDBC驱动程序定义的数据源
    • 基于连接池的JNDI数据源
    • 基于连接池的本地数据源

 配置数据源

  • 数据库连接池
    • Apache Commons Database Connection Pooling
    • DBCP 通过实现 javax.sql.DataSource 接口
public interface DataSource  extends CommonDataSource,Wrapper {

	Connection getConnection() throws SQLException; 
 
	Connection getConnection(String username, String password) 
				     throws SQLException;
}
  •  DBCP数据库连接池
    • BasicDataSource
    • initialSize :初始化连接数量,默认值为0
    • maxActive :最大连接数,默认值为8
    • maxIdle:闲置连接的最大数量,默认为8
    • minIdle:闲置连接的最小数量,默认为0
    • maxWait:最大等待时间,以毫秒为单位。
    • minEvictableIdleTimeMillis  :闲置连接被逐出连接池的时间期限,以毫秒为单位,默认为30分钟
  • 创建DBCP数据库连接池
BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/ssm");
        ds.setUsername("root");
        ds.setPassword("root");
        ds.setInitialSize(5);
        ds.setMaxActive(100);
        ds.setMaxIdle(20);
        ds.setMinIdle(1);
        ds.setMaxWait(3000);
        Connection conn = ds.getConnection();
        System.out.println("NumActive:" + ds.getNumActive());//连接数量
        System.out.println("NumIdle: " + ds.getNumIdle());//闲置连接数量
  •  创建DBCP数据库连接池
    • 关闭数据源  ds.close()
    • 数据库连接池对象一般都是以唯一实例形式存在的
    • 向这个唯一的数据库连接池对象发送连接请求

基于Tomcat配置JNDI实现DBCP数据库连接池基本案例

注意:项目需要已经搭建好了tomcat运行环境

第一步:创建数据库表

例如t_user保存用户的基本信息,user_id(用户id),user_name(用户名),password(密码)

第二步:创建maven项目,导入相关依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.11</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.11</version>
    </dependency>

    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.1</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>

    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>3.0.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>

第三步:创建实体类和Tomcat的JNDI配置

User

这里的属性名和数据库中的字段名(列名),保持一致,目的是不用手动进行映射了,方便sql语句书写。

public class User implements Serializable {
    private int user_id;
    private String user_name;
    private String password;

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

JNDI

打开本地的tomcat应用目录,找到conf文件夹,打开context.xml配置文件,在<Context>标签内的末尾添加如下配置:

	<Resource name="jdbc/root"  
			  auth="Container"
			  type="org.apache.commons.dbcp.BasicDataSource"
			  username="root"
			  password="root" 
			  driverClassName="com.mysql.cj.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/csx_demo?serverTimezone=Asia/Shanghai&amp;useU nicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
			  initialSize="10" 
			  maxActive="100"
			  maxIdle="10" 
			  minIdle="5"
			  maxWait="10000" 

其中username,password,driverClassName为本地mysql的连接配置,每个主机不同

配置完本地tomcat后,在spring的配置文件中添加如下配置:

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:component-scan base-package="com.csx"/>

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/root"/>
    </bean>


</beans>	
	

这里面的数据源bean的配置是与tomcat里面的配置保持一致的

第四步:创建DAO层,完成相应的sql语句

UserDao

public interface UserDao {
    public List<User> getAllUsers();
}

UserDaoImpl

@Component("userDao")
public class UserDaoImpl implements UserDao{
    @Resource(name = "dataSource")
    private DataSource dataSource;
    @Override
    public List<User> getAllUsers() {


        List<User>list=new ArrayList<>();
        try {
            Connection conn= dataSource.getConnection();
            String sql="select * from t_user";
            PreparedStatement pstmt=conn.prepareStatement(sql);
            ResultSet rs= pstmt.executeQuery();

            while (rs.next()){
                User user= new User();
                user.setUser_id(rs.getInt("user_id"));
                user.setUser_name(rs.getString("user_name"));
                user.setPassword(rs.getString("password"));
                list.add(user);
            }


        } catch (SQLException e) {
            e.printStackTrace();
        }


        return list;
    }
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

第五步:完成对应的servlet和jsp页面

定义servlet查询数据库中的数据,定义jsp来展示遍历出来的用户数据

 UserServlet

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
        UserDao userDao= (UserDao) ac.getBean("userDao");
        List<User> list= userDao.getAllList();
        req.setAttribute("list",list);
        req.getRequestDispatcher("list.jsp").forward(req,resp);


    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

list.jsp

<%--
  Created by IntelliJ IDEA.
  User: 21038
  Date: 2024/9/30
  Time: 14:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<c:forEach items="${list}" var="u">
    ${u.user_id},${u.user_name},${u.password} <br/>
</c:forEach>


</body>
</html>

第六步:启动tomcat,进行测试

 在localhost:8080/项目名/servlet映射路径

总结

 如果不知道如何搭建本地tomcat并启动javaweb项目,可以参考我的另一篇博客

idea2023-快速搭建一个本地tomcat的javaWeb项目(从0到1保姆教学)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法题总结(四)——螺旋矩阵

螺旋矩阵 59、螺旋矩阵二 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输…

2.点位管理开发(续)及设计思路——帝可得后台管理系统

目录 前言一、页面原型二、修改1、页面展示2、新增 3 、总结思路 前言 提示&#xff1a;本篇继续点位管理的改造 一、页面原型 页面展示新增 二、修改 1、页面展示 页面修改&#xff1a;修改标签换行、顺序顺序、地址过长时换行问题&#xff1b; <el-table v-loading…

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)

七&#xff0c;MyBatis-Plus 扩展功能&#xff1a;乐观锁&#xff0c;代码生成器&#xff0c;执行SQL分析打印&#xff08;实操详细使用&#xff09; 文章目录 七&#xff0c;MyBatis-Plus 扩展功能&#xff1a;乐观锁&#xff0c;代码生成器&#xff0c;执行SQL分析打印&#…

愿祖国富强!肌肉水凝胶的奥秘,自协调与光驱动,运动模式大揭秘

大家好&#xff0c;在这个国庆佳节&#xff0c;我们一同感受科技的魅力。今天来了解一种特殊的肌肉样水凝胶&#xff0c;它通过自协调形状变化和摩擦调节&#xff0c;能在光的引导下实现多样运动。这一成果为软机器人发展带来新契机——《Light-steered locomotion of muscle-l…

基于ScriptableObject设计游戏数据表

前言 本篇文章是针对之前对于ScriptableObject概念讲解的实际应用之一&#xff0c;在游戏开发中&#xff0c;我们可以使用该类来设计编辑器时的可读写数据表或者运行时的只读数据表。本文将针对运行时的只读数据表的应用进行探索&#xff0c;并且结合自定义的本地持久化存储方式…

一级建造师备考攻略及一建各科老师推荐(各科四大金刚)

吐血整理:真正的实战派一建名师推荐! 考过的同学一定都知道推荐的老师YYDS! 一级建造师各科老师推荐: 《法规》名师:王欣、王竹梅、陈印、关涛 其他老师:房超、蔡恒、刘丹、武海峰、陈洁、安国庆、桂林 《管理》名师:宿吉南、龙炎飞、李向国、朱俊文 其他老师:缴广才、陈晨…

跟《经济学人》学英文:2024年09月28日这期 The curse of the Michelin star

The curse of the Michelin star Restaurants awarded the honour are more likely to close, research finds 原文&#xff1a; The twelve new restaurants added to the New York Michelin Guide this month, serving up cuisine ranging from “haute French” to “eco…

9.数据结构与算法-单链表,循环链表和双向链表的比较////顺序表和链表的比较

单链表&#xff0c;循环链表和双向链表的时间效率比较 顺序表和链表的区别 存储密度

HarmonyOS Next应用开发——自定义组件的使用

自定义组件的使用 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与…

达梦数据库开启归档模式

目录 一、什么是归档模式&#xff1f; 二、开启归档模式的步骤 1、创建归档目录 2、进入dm数据库bin目录 3、登录数据库 4、关闭数据库 5、启动数据库到Mount状态 6、增加本地归档日志文件 7、开启归档 8、启动数据库 9、验证是否开启成功 三、开启归档模式的优…

Lj视频下载器 1.1.37 简洁高效的视频下载工具

Lj视频下载器是一个功能强大的视频下载器&#xff0c;支持直接添加视频地址或 m3u8 资源地址&#xff0c;可以从网页中自动提取视频进行下载。支持多种视频格式&#xff0c;包括 m3u8&#xff0c;并能自动检测并移除广告片段。 大小&#xff1a;19M 百度网盘&#xff1a;https…

Linux CentsOS定时删除一个目录下(包含子目录)的改动时间大于12小时的文件

Shell脚本 文件目录如下图 ** 查找/ai/img/目录下的所有文件** find /ai/img/ -type f查找/ai/img/目录下的所有上次改动时间大于720分钟(12小时)的文件 12 小时&#xff0c;也就是 720 分钟。所以&#xff0c;我们可以使用 -mmin 720 来查找修改时间超过 720 分钟&#xff08;…

uniapp 微信小程序 微信支付

本章的内容我尽量描述的细致一些&#xff0c;哪里看不懂给我评论就可以&#xff0c;我看到进行回复 微信支付大致分为4步&#xff0c;具体看后端设计 1. 获取code 2. 根据code获取openid 3. 根据openid&#xff0c;以及部分订单相关数据&#xff0c;生成prepayId (预支付交易会…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…

交通场景多目标检测系统源码分享

交通场景多目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Qt界面优化——绘图API

文章目录 绘图核心API绘制各种形状绘制线段绘制矩形绘制圆形绘制文本设置画笔设置画刷 绘制图片 绘图核心API Qt的各种控件&#xff0c;本质上都是画出来的&#xff0c;这不过这些都是提前画好了&#xff0c;我们拿过来直接使用即可。 实际开发中&#xff0c;可能现有控件无法…

面了智谱大模型算法岗,效率贼高!

最近这一两周不少互联网公司都已经开始秋招提前批面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…

使用容器启动的zk无法暴露3888问题解决

1. 问题描述 zk配置如下&#xff1a; 我通过容器启动了一个zk&#xff0c;通过-p 参数暴露了2181和3888端口&#xff0c;容器启动脚本如下&#xff1a; #!/bin/shdocker rm -f myzookeeper1docker run -p 12181:2181 -p 13888:3888 --name myzookeeper1 --restart always …

C# 字符串(String)的应用说明一

一.字符串&#xff08;String&#xff09;的应用说明&#xff1a; 在 C# 中&#xff0c;更常见的做法是使用 string 关键字来声明一个字符串变量&#xff0c;也可以使用字符数组来表示字符串。string 关键字是 System.String 类的别名。 二.创建 String 对象的方法说明&#x…

c++ 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件&#xff1a; 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…