ThreadLocal - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gao6rich
V2EX    Java

ThreadLocal

  •  
  •   gao6rich Dec 12, 2022 3309 views
    This topic created in 1234 days ago, the information mentioned may be changed or developed.

    请问 Java 中为什么一个数据库的 Connection 放到 ThreadLocal 里面复制出来多个副本在多线程中使用的话,可以互相不影响的用,实际上跟数据库不是还是只有一个连接吗?如果多线程不是同一个连接的话,跟不使用 ThreadLocal ,每个线程新建一个 connection 有什么区别呢[发呆]

    13 replies    2022-12-14 10:09:36 +08:00
    7911364440
        1
    7911364440  
       Dec 12, 2022
    贴下代码?
    ih8es9OIzne0959p
        2
    ih8es9OIzne0959p  
       Dec 12, 2022
    个人看法,主要用于传值,比如 Controler 层处理过后还需要给 mapper 层这种情景
    optional
        3
    optional  
       Dec 12, 2022 via iPhone
    这样连接数不就和线程数量绑定了,对于连接数有限的数据库实例不是很尴尬,比如 pg
    chendy
        4
    chendy  
       Dec 12, 2022
    一个线程一个连接
    做声明式的事务控制之类的比较方便
    wolfie
        5
    wolfie  
       Dec 12, 2022
    看得一堆问号。

    去看看数据库连接池。
    gao6rich
        6
    gao6rich  
    OP
       Dec 12, 2022
    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

    这两者有什么区别呢
    franpinx2
        7
    franpinx2  
       Dec 12, 2022
    你这样没什么区别 主要看 DriverManager.getConnection()这个方法是怎么实现的
    franpinx2
        8
    franpinx2  
       Dec 12, 2022
    @gao6rich 看了下 这个方法的底层没有做池化 所以你每次都会建立一个新的数据库连接 是个不推荐的写法
    kaneg
        9
    kaneg  
       Dec 12, 2022
    数据库的连接可是很宝贵的资源,而线程池里的线程尽管不是毫无价值,但比起数据库的连接来说便宜很多。所以,当某个线程需要数据库连接的时候,就从连接池中拿一个,用完立即释放以便别的线程可以申请到。
    boatrain1111
        10
    boatrain1111  
       Dec 12, 2022
    用的是同一个 tcp 连接吧
    CRVV
        11
    CRVV  
       Dec 12, 2022
    thread-local 是指每个线程都有自己的变量。虽然代码里面是同一个变量,但每个线程用的是各自的变量。
    所以每个线程里面用的是不同的 connection 。数据库连接和线程数一样多。


    > 如果多线程不是同一个连接的话,跟不使用 ThreadLocal ,每个线程新建一个 connection 有什么区别呢

    如果每个线程新建一个连接,用完就关下次再重连,那就没有区别。
    如果要把连接留着以后再用,就需要一个地方存着这个 connection ,下次再用的时候每个线程每次都能拿到当前线程的 connection 。当然可以自己实现这一套东西,实现好了你就重写了 thread-local
    lyusantu
        12
    lyusantu  
       Dec 13, 2022
    ThreadLocal 允许线程之间共享数据库连接
    byte10
        13
    byte10  
       Dec 14, 2022
    17 楼 表达正确,ThreadLocal 主要是就是传递开启事务中的 mysql 链接。同一个事务,连接是同一个的。如果没有事务的话,你同一个线程得到的 mysql 连接都可能不一样。
    About     Help     Advertise     Blog     API     FAQ     Solana     5723 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 68ms UTC 06:18 PVG 14:18 LAX 23:18 JFK 02:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86