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

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日

相关文章

  • Spring Security保护用户密码常用方法详解

    Spring Security保护用户密码常用方法详解 前言 在现代的Web开发中,安全性已经成为一个重要的问题。尤其是涉及到用户密码的相关处理,更是需要严格保护。 Spring Security是一个开源的Web安全框架,它提供了一些集成化的解决方案,可以快速、轻松地保护我们的应用程序的安全。这篇文章将介绍Spring Security保护用户密码的一些常…

    Java 2023年5月20日
    00
  • 如何安装java的运行环境IDEA

    安装Java的运行环境(JRE)是使用IntelliJ IDEA的前提条件。在安装IDEA之前,用户需要先安装JRE。以下是完整的安装JRE以及IntelliJ IDEA的攻略: 1. 安装Java的运行环境(JRE) Windows系统 打开Oracle Java SE下载页面。 在“Java SE 15及后续版本”下,单击“JDK下载”。 接受许可协议并…

    Java 2023年5月26日
    00
  • Spring Boot 教程之创建项目的三种方式

    下面我将为您详细讲解“Spring Boot 教程之创建项目的三种方式”的完整攻略。 1. 概述 Spring Boot 是一个快速开发的框架,它提供了很多开箱即用的功能,可以让我们更轻松地创建和开发 Web 应用程序。创建 Spring Boot 项目的方法有很多,本文将介绍其中的三种方式。 2. 使用 Spring Initializr 创建 2.1 打…

    Java 2023年5月19日
    00
  • java基于jcifs.smb实现远程发送文件到服务器

    下面是关于“Java基于jcifs.smb实现远程发送文件到服务器”的完整攻略。 概述 jcifs.smb是一个java实现的SMB网络协议库,可以在java应用程序中实现与SMB服务器的连接。通过这个库,我们可以在java中实现与文件共享服务器之间的文件传输。在接下来的攻略中,我将详细介绍如何使用jcifs.smb库实现远程发送文件到服务器。 步骤一:引入…

    Java 2023年5月20日
    00
  • Java用正则表达式实现${name}形式的字符串模板实例

    那么让我们来详细讲解一下“Java用正则表达式实现${name}形式的字符串模板实例”的完整攻略。 第一步:定义模板字符串 首先,我们需要定义一个模板字符串,例如: String template = "Hello, ${name}! Welcome to our website."; 这个模板字符串中包含了一个占位符${name},我们…

    Java 2023年5月29日
    00
  • 简单了解JAVA NIO

    Java NIO 简介 Java NIO即Java非阻塞式IO (Java Non-blocking I/O)。Java NIO提供了一种新的 IO工作方式和API。它比原生的Java IO(Java IO通过流的方式读取数据,而NIO则是通过通道(channel)和缓冲区(buffer)来读取数据)更加高效,也更易于扩展。虽然Java NIO比Java I…

    Java 2023年5月24日
    00
  • 利用Kotlin + Spring Boot实现后端开发

    接下来我将详细讲解如何使用Kotlin和Spring Boot实现后端开发的完整攻略。 前置条件 了解Kotlin和Spring Boot的基础知识 安装好Kotlin和Java开发环境 开始实现 步骤一:创建Spring Boot项目 首先我们需要创建一个Spring Boot项目,可以使用你喜欢的IDE或命令行工具来完成。为了使用Kotlin,我们需要在…

    Java 2023年5月19日
    00
  • 浅谈Java响应式系统

    浅谈Java响应式系统 什么是Java响应式系统 Java响应式系统是一种基于反应式编程(Reactive Programming,简称RP)思想的编程模式,它使用异步流来构建可靠性高,性能较好的应用程序。在Java响应式系统中,数据流可以被看作是一系列的事件或者消息,应用程序可以通过订阅这些事件或者消息来进行处理。Java响应式系统常常被用于处理大规模数据…

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