Java实现数据库连接池简易教程

yizhihongxing

Java实现数据库连接池简易教程

在Java web开发中,经常会使用到数据库连接池技术,它可以缓存一定数量的数据库连接,通过再次请求时,优先从连接池中获取已有的连接,而不是重新创建连接,从而提高程序的性能和响应速度。在这里,我们将详细讲解如何使用Java语言来实现一个简单的数据库连接池。

步骤

第一步:创建连接池

首先,我们需要创建连接池,代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

public class ConnectionPool {
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost:3306/test";
    private static final String username = "root";
    private static final String password = "123456";
    private static final int initSize = 5;
    private static final int maxSize = 10;
    private ArrayList<Connection> pool = new ArrayList<>();

    public ConnectionPool() {
        for (int i = 0; i < initSize; i++) {
            try {
                Class.forName(driver);
                Connection conn = DriverManager.getConnection(url, username, password);
                pool.add(conn);
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized Connection getConnection() {
        Connection conn = null;
        if (pool.size() > 0) {
            conn = pool.remove(0);
        } else {
            if (pool.size() < maxSize) {
                try {
                    Class.forName(driver);
                    conn = DriverManager.getConnection(url, username, password);
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return conn;
    }

    public synchronized void release(Connection conn) {
        if (pool.size() < maxSize) {
            pool.add(conn);
        } else {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

以上代码中,我们使用了ArrayList集合来创建连接池pool,其中initSize为连接池的初始大小,maxSize为连接池的最大大小(即连接池最大可存储的连接数)。getConnection()方法用于从连接池中获取连接,如果连接池中有连接,则直接获取并返回,否则如果连接池未达到最大大小,则创建新的连接返回。release()方法用于将使用过的连接归还到连接池中。

第二步:测试

接下来,我们使用测试代码来验证我们的连接池是否正常工作,测试代码如下:

public class Test {
    public static void main(String[] args) {
        ConnectionPool pool = new ConnectionPool();
        for (int i = 0; i < 15; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    Connection conn = pool.getConnection();
                    try {
                        // 这里执行对数据库的相关操作
                        Statement stmt = conn.createStatement();
                        ResultSet rs = stmt.executeQuery("SELECT * FROM user");
                        while(rs.next()){
                            String userName = rs.getString("name");
                            String userAge = rs.getString("age");
                            System.out.println("name: " + userName + " | age: " + userAge);
                        }
                        rs.close();
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    pool.release(conn);
                }
            });
            t.start();
        }
    }
}

运行测试代码后,我们可以看到输出结果中每个线程一次性获取多个连接进行数据库操作,证明连接池正常工作。

示例说明

示例1:使用连接池进行数据库操作

我们可以看到,在测试代码中,我们每次使用getConnection()方法来获取数据库连接,并使用release()方法将连接归还到连接池中。在获取到连接后,我们使用Statement来进行生成查询的SQL,并使用ResultSet来获取执行结果。

Connection conn = pool.getConnection();
try {
    // 这里执行对数据库的相关操作
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM user");
    while(rs.next()){
        String userName = rs.getString("name");
        String userAge = rs.getString("age");
        System.out.println("name: " + userName + " | age: " + userAge);
    }
    rs.close();
    stmt.close();
} catch (SQLException e) {
    e.printStackTrace();
}
pool.release(conn);

示例2:改变连接池大小

我们可以看到,在连接池构造函数中,我们将连接池的初始大小设置为5:

private static final int initSize = 5;

而在getConnection()方法中,我们使用了if语句判断当前连接池中连接的数量是否大于0,如果大于0,则取出最先加入到连接池中的连接,如果没有连接,则创建新的连接。而在release()方法中,我们使用了if语句判断连接池的大小是否达到最大值,如果没有,则将使用过的连接放回连接池中,否则关闭该连接。

如果将initSize改为10,则连接池初始化的时候,将会创建10个数据库连接:

private static final int initSize = 10;

如果将maxSize改为20,则连接池最大可存储的连接数将变为20,连接数可继续增加:

private static final int maxSize = 20;

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现数据库连接池简易教程 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JDK动态代理之ProxyGenerator生成代理类的字节码文件解析

    关于“JDK动态代理之ProxyGenerator生成代理类的字节码文件解析”的攻略,我将分为以下几步进行讲解: 简介和背景知识 ProxyGenerator的介绍 通过实例了解ProxyGenerator的核心方法 示例1:使用ProxyGenerator生成代理类的字节码文件 示例2:通过反编译工具解析代理类的结构 总结 接下来,我将逐一进行讲解。 1.…

    Java 2023年5月26日
    00
  • MyBatis映射关系详解

    下面是对”MyBatis映射关系详解”的详细解释及示例。 MyBatis映射关系详解 在MyBatis框架中,映射关系是将SQL语句和Java对象之间的关系进行映射,使得Java对象和数据库表之间的操作变得简单。在MyBatis中,映射关系可以通过XML文档或注解进行配置。 XML映射关系配置 XML映射关系配置主要包括以下两个部分: 结果映射 结果映射是将…

    Java 2023年5月19日
    00
  • 如何把springboot jar项目 改为war项目

    首先需要了解的是,Spring Boot默认创建的是JAR项目,JAR包是一种Java的打包格式,跟普通的ZIP包大同小异。而WAR包是Java Web的打包格式。 将Spring Boot jar项目转为war项目,主要需要以下步骤: 1. 修改pom.xml文件 在Spring Boot的Maven项目中,需要在pom.xml文件中添加Web依赖和打包方…

    Java 2023年5月28日
    00
  • Java对象的创建过程是什么?

    Java对象的创建过程是Java程序中非常基础、也非常重要的一部分。在Java编程中开发者需要清楚理解Java对象创建的整个流程,本文将为读者详细讲解Java对象的创建过程。 Java对象的创建过程 在Java编程中,创建一个Java对象涉及到了三个步骤: 1、类的加载与加载机制 类的加载与加载机制是Java程序启动时的第一步,Java类需要在Java虚拟机…

    Java 2023年5月11日
    00
  • 浅谈Java springboot日志管理

    浅谈Java Spring Boot日志管理 作为 Java 程序员,我们使用日志来记录程序运行过程中的状态信息和错误信息。Spring Boot 提供了使用很方便的日志处理方式。在本文中,我们将介绍如何在 Spring Boot 项目中管理日志。 添加日志依赖 Spring Boot 自带日志框架,常用的是 logback 和 log4j2。如果你想使用其…

    Java 2023年5月19日
    00
  • Java使用NIO优化IO实现文件上传下载功能

    我来为您讲解一下“Java使用NIO优化IO实现文件上传下载功能”的完整攻略。 概述 Java NIO library 是Java语言提供的一种基于缓冲区、非阻塞的IO,使得Java应用程序能够快速轻便地处理并发客户端请求。使用Java NIO实现文件上传下载功能的好处是可以大大提高系统的吞吐量、降低系统的IO延迟,而且还能避免阻塞线程,提高服务器的并发能力…

    Java 2023年5月19日
    00
  • java判定数组或集合是否存在某个元素的实例

    下面是Java判断数组或集合是否存在某个元素的攻略。 判断数组中是否存在某个元素 要判断一个数组中是否存在某个元素,可以使用Java中的for循环来遍历整个数组,然后逐个判断元素是否相等。具体流程如下: int[] arr = {1, 2, 3, 4, 5}; int target = 3; // 要查找的元素 boolean found = false; …

    Java 2023年5月26日
    00
  • Spring Boot 项目启动失败的解决方案

    Spring Boot是一个非常流行的Java框架,但在启动Spring Boot项目时,可能会遇到各种问题。以下是详细讲解Spring Boot项目启动失败的解决方案的完整攻略: 检查依赖 在启动Spring Boot项目之前,我们需要检查项目的依赖是否正确。我们可以使用以下命令来检查项目的依赖: mvn dependency:tree 该命令将显示项目的…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部