面试题答案
一键面试- 简述实现思路:
ThreadLocal
类提供了线程局部变量,每个线程都有自己独立的变量副本。在Java Web应用中,我们可以通过ThreadLocal
来为每个线程存储独立的数据库连接。当线程需要使用数据库连接时,从ThreadLocal
中获取,如果不存在则创建一个新的连接并放入ThreadLocal
中。当线程结束时,需要关闭并清理ThreadLocal
中的数据库连接,以避免资源泄漏。
- 关键代码示例:
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的doGet
或doPost
方法结束时调用,或者在使用过滤器等方式进行统一处理。