JDBC-Util

JDBC-Util

JDBC连接池工具类的封装 V1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.xiaobai.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtil {
//JDBC工具类 V1.0
//创建一个连接池引用,提供给当前项目的全局使用
private static DataSource dataSource;

//static代码块中的内容随项目启动而加载,当项目启动时,自动建立连接池
static {
try {
Properties properties = new Properties();
InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(resourceAsStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

//对外开放一个获取连接的方法
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

//对外开放一个回收链接的方法
public static void close(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

TreadLocal

java.lang.TreadLocal,为解决多线程程序的并发问题的工具类

通常用来在多线程中管理、共享数据库连接、Session等

在Java中,每一个线程对象都有TreadLocalMap<Threadlocal, Object> ,其key是ThreadLocal,Object为该线程的共享对象


JDBC连接池工具类的封装 V2.0

使用Treadlocal改写工具类的意义就是:

同一个线程在多次操作数据库的过程中,用到的是同一个连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
* JDBC工具类 V2.0
* 创建一个连接池引用,提供给当前项目的全局使用
* 同时,维护了一个线程绑定变量的ThreadLocal对象
* 后续,加入了对事务回收线程的判定,方便事务的使用
*/
public class JDBCUtilV2 {
private static DataSource dataSource;
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
;

/*
static代码块中的内容随项目启动而加载,当项目启动时,自动建立连接池
*/
static {
try {
Properties properties = new Properties();
InputStream resourceAsStream = JDBCUtilV2.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(resourceAsStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* 对外开放一个获取连接的方法
*
* @return 返回一个从连接池中获取到的连接
*/
public static Connection getConnection() {
try {
//在threadlocal中获取Connection
Connection connection = threadLocal.get();
if (connection == null) {
//此时,threadLocal中没有连接,是第一次获取
connection = dataSource.getConnection();
threadLocal.set(connection);
}
return connection;
//如果是第一次获取,则从连接池中拿一个连接,先放到threadlocal中,再把该连接返回
//如果不是第一次获取,则从threadlocal中获取到这个连接,把该链接返回
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

/**
* 这是一个回收连接的方法
*/
public static void close() {
try {
//从theadlocal中获取到连接,判断是否有线程
//如果有,该连接回收到连接池,并将threadlocal中的连接移除
Connection connection = threadLocal.get();
if (connection != null) {
connection.close();
threadLocal.remove();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}


JDBC-Util
http://blog.170827.xyz/2024/04/20/JDBC-Util/
作者
XIAOBAI
发布于
2024年4月20日
许可协议