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

前言

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

配置数据源

  • 数据库连接池
    • Apache Commons Database Connection Pooling
    • DBCP 通过实现 javax.sql.DataSource 接口
java 复制代码
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数据库连接池
java 复制代码
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项目,导入相关依赖

XML 复制代码
    <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语句书写。

java 复制代码
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>标签内的末尾添加如下配置:

XML 复制代码
	<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 复制代码
<?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

java 复制代码
public interface UserDao {
    public List<User> getAllUsers();
}

UserDaoImpl

java 复制代码
@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

java 复制代码
@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

html 复制代码
<%--
  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博客

相关推荐
今天不coding1 分钟前
MySQL体系架构
数据库·mysql·体系架构·网络连接层·服务层·存储引擎层·系统文件层
会说法语的猪4 分钟前
IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理
java·ide·intellij-idea
喝醉酒的小白12 分钟前
PostgreSQL: 事务年龄
数据库·postgresql
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ13 分钟前
MyBatis执行完sql后,返回的数值代表的意思
java·开发语言
码到成龚15 分钟前
SQL server学习10-数据库编程(中)
数据库·学习
wlyang66616 分钟前
1. SQL常见笔试题目
数据库·sql
smilejingwei20 分钟前
SQL,生成指定时间间隔内的事件次序号
数据库·sql·spl·esprocspl
CodeClimb1 小时前
【华为OD-E卷-寻找密码 100分(python、java、c++、js、c)】
java·python·华为od
爱上语文1 小时前
宠物管理系统:Service层
java·开发语言·宠物
水w1 小时前
【项目实践】SpringBoot Nacos配置管理 map数据
java·服务器·开发语言·spring boot·nacos