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博客

相关推荐
前行的小黑炭38 分钟前
设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
android·java·kotlin
Java技术小馆43 分钟前
如何设计一个本地缓存
java·面试·架构
数据智能老司机1 小时前
CockroachDB权威指南——SQL调优
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——应用设计与实现
数据库·分布式·架构
XuanXu2 小时前
Java AQS原理以及应用
java
数据智能老司机2 小时前
CockroachDB权威指南——CockroachDB 模式设计
数据库·分布式·架构
风象南4 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
mghio13 小时前
Dubbo 中的集群容错
java·微服务·dubbo
咖啡教室18 小时前
java日常开发笔记和开发问题记录
java