这个问题我疑问了很久很久,主要如下截图。

个连接对应一个事务,多个连接的事务是不一样的,先大概了解一下,往下看????
本人是在学threadlocal的时候,网上大部分人都是说数据库连接池是典型的用了threadloca的例子,然后我就又查数据库连接池和threadloca的关系,但是,99%都说threadlocal是为了在并发的情况下,为了保证线程安全,创建了副本什么的,其实这只是threadlocal的用法之一,它还有个用法就是确保同一线程之间参数传递的方便(扯远了)
回归正题,还是拿上面的图来说事。。。。
我只讲两个关键点,明白人一看就懂:
1、两者有根本性的区别,用处不一样!
而ThreadLocal缓存连接,是为了把同一个数据库连接“分享”给同一个线程的不同调用方法。(不管调用哪个方法,都是使用的同一个连接,方便进行“跨方法”的事务控制)
2、重点要理解“连接池”。
java.sql.DriverManager.getConnection(url, props);
java.sql.Driver.connect(url, props);
PS:所以说:使用数据库连接池时,还是要显式的调用数据库连接池API提供的关闭连接的方法。
理解一下这句话:
不同的线程在同一个时间( 或者 同一个线程在多个地方)从连接池中拿到的Connection,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)
总结:
1、首先,我们为了避免单一数据库连接的创建和关闭耗费时间和性能,引入了数据库连接池,提前创建好了n条连接放入池中,如果是单线程情况下,那这样挺好的
2、那如果是多线程情况下呢?还是上面那段话,假设同一时间多个线程从数据库连接池获取连接,那肯定拿的是不同的连接,我当前线程和别的线程拿的连接不一样,那我当前在crud的时候,不在一个事务之内。
来源:http://mtw.so/5uzL9h
本文探讨数据库连接池和ThreadLocal的关系。连接池缓存并托管数据库连接以提高性能,ThreadLocal缓存连接是为方便同一线程跨方法的事务控制。单线程使用连接池较好,多线程时,不同时间的线程可能拿到同一连接,引入ThreadLocal可创建独立连接副本,避免干扰。
1万+

被折叠的 条评论
为什么被折叠?



