请问 Java 中为什么一个数据库的 Connection 放到 ThreadLocal 里面复制出来多个副本在多线程中使用的话,可以互相不影响的用,实际上跟数据库不是还是只有一个连接吗?如果多线程不是同一个连接的话,跟不使用 ThreadLocal ,每个线程新建一个 connection 有什么区别呢[发呆]
1
7911364440 2022-12-12 17:32:21 +08:00
贴下代码?
|
2
ajaxgoldfish 2022-12-12 17:35:57 +08:00
个人看法,主要用于传值,比如 Controler 层处理过后还需要给 mapper 层这种情景
|
3
optional 2022-12-12 17:47:56 +08:00 via iPhone
这样连接数不就和线程数量绑定了,对于连接数有限的数据库实例不是很尴尬,比如 pg
|
4
chendy 2022-12-12 17:50:43 +08:00
一个线程一个连接
做声明式的事务控制之类的比较方便 |
5
wolfie 2022-12-12 18:19:34 +08:00
看得一堆问号。
去看看数据库连接池。 |
6
gao6rich OP class ConnectionManager {
private Connection connect = null; public Connection openConnection() { if (connect == null) { connect = DriverManager.getConnection(); } return connect; } public void closeConnection() { if (connect != null) connect.close(); } } class Dao { public void insert() { ConnectionManager connectionManager = new ConnectionManager(); Connection connection = connectionManager.openConnection(); // 使用 connection 进行操作 connectionManager.closeConnection(); } } ===========================================使用 ThreadLocal public class ConnectionManager { private static final ThreadLocal<Connection> dbConnectionLocal = new ThreadLocal<Connection>() { @Override protected Connection initialValue() { try { return DriverManager.getConnection("", "", ""); } catch (SQLException e) { e.printStackTrace(); } return null; } }; public Connection getConnection() { return dbConnectionLocal.get(); } } ===========================================不使用 ThreadLocal 这两者有什么区别呢 |
7
franpinx2 2022-12-12 19:35:35 +08:00
你这样没什么区别 主要看 DriverManager.getConnection()这个方法是怎么实现的
|
9
kaneg 2022-12-12 19:51:29 +08:00
数据库的连接可是很宝贵的资源,而线程池里的线程尽管不是毫无价值,但比起数据库的连接来说便宜很多。所以,当某个线程需要数据库连接的时候,就从连接池中拿一个,用完立即释放以便别的线程可以申请到。
|
10
boatrain1111 2022-12-12 19:54:19 +08:00
用的是同一个 tcp 连接吧
|
11
CRVV 2022-12-12 23:29:12 +08:00
thread-local 是指每个线程都有自己的变量。虽然代码里面是同一个变量,但每个线程用的是各自的变量。
所以每个线程里面用的是不同的 connection 。数据库连接和线程数一样多。 > 如果多线程不是同一个连接的话,跟不使用 ThreadLocal ,每个线程新建一个 connection 有什么区别呢 如果每个线程新建一个连接,用完就关下次再重连,那就没有区别。 如果要把连接留着以后再用,就需要一个地方存着这个 connection ,下次再用的时候每个线程每次都能拿到当前线程的 connection 。当然可以自己实现这一套东西,实现好了你就重写了 thread-local |
12
lyusantu 2022-12-13 09:26:37 +08:00
ThreadLocal 允许线程之间共享数据库连接
|
13
byte10 2022-12-14 10:09:36 +08:00
17 楼 表达正确,ThreadLocal 主要是就是传递开启事务中的 mysql 链接。同一个事务,连接是同一个的。如果没有事务的话,你同一个线程得到的 mysql 连接都可能不一样。
|