MST

星途 面试题库

面试题:Java中ThreadLocal在数据库连接管理场景的应用

在一个Java Web应用中,需要为每个线程维护独立的数据库连接。请简述如何使用ThreadLocal来实现这一功能,并给出关键代码示例。
32.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 简述实现思路
    • ThreadLocal类提供了线程局部变量,每个线程都有自己独立的变量副本。在Java Web应用中,我们可以通过ThreadLocal来为每个线程存储独立的数据库连接。当线程需要使用数据库连接时,从ThreadLocal中获取,如果不存在则创建一个新的连接并放入ThreadLocal中。当线程结束时,需要关闭并清理ThreadLocal中的数据库连接,以避免资源泄漏。
  2. 关键代码示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnectionUtil {
    // 使用ThreadLocal来存储每个线程的数据库连接
    private static final ThreadLocal<Connection> connectionThreadLocal = new ThreadLocal<>();

    // 获取数据库连接
    public static Connection getConnection() {
        Connection connection = connectionThreadLocal.get();
        if (connection == null) {
            try {
                // 这里假设使用MySQL数据库,加载驱动并获取连接
                Class.forName("com.mysql.cj.jdbc.Driver");
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdatabase", "username", "password");
                connectionThreadLocal.set(connection);
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

    // 关闭数据库连接并清理ThreadLocal
    public static void closeConnection() {
        Connection connection = connectionThreadLocal.get();
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                connectionThreadLocal.remove();
            }
        }
    }
}

在上述代码中:

  • connectionThreadLocal是一个ThreadLocal实例,用于存储每个线程的Connection对象。
  • getConnection方法用于获取数据库连接,如果当前线程的ThreadLocal中没有连接,则创建一个新的连接并设置到ThreadLocal中。
  • closeConnection方法用于关闭当前线程的数据库连接,并从ThreadLocal中移除该连接,以避免资源泄漏。在实际的Java Web应用中,这个方法通常在请求处理完成后调用,比如在Servlet的doGetdoPost方法结束时调用,或者在使用过滤器等方式进行统一处理。