【问题标题】:Does one connection could be hold by two thread at the same time in spring-jdbc?在 spring-jdbc 中,一个连接是否可以同时被两个线程保持?
【发布时间】:2019-09-15 17:45:26
【问题描述】:

在这个link中,作者声明:

"在此更改存储后 序列表使用的引擎可以是 MyISAM 或 INNODB,因为 序列是使用新连接分配的,而不是 受到可能正在进行的任何其他交易的影响。 ”。

我们为什么要创建一个新的连接来启动一个事务?我认为如果一个连接没有同时被两个线程持有,那么这个连接上就不会有“其他事务”。一个连接可以同时被两个线程看到吗?

【问题讨论】:

    标签: java spring jdbc spring-jdbc


    【解决方案1】:

    我们为什么要创建一个新的连接来启动一个事务?

    因为没有办法绕过它。您必须先与数据库建立连接,然后才能查询数据库。

    两个线程可以同时看到一个连接吗?

    是的,它could。特别是如果两个线程正在使用不同的表进行操作。为什么不重用现有的连接?在更现代的框架中,您会发现连接池具有开放的连接池,任何线程都可以使用它。最好有一个连接池。

    【讨论】:

    • 虽然理论上可以通过多个线程共享一个连接,但在实践中却是个坏主意。尽可能避免它,并且只有在这些线程仔细协调它们的活动时才这样做(例如,您不希望一个线程提交或回滚,而另一个线程仍在工作,完全期望事务继续)。
    • @AlanSereb 在这个链接中,作者做了一个代码优化。原代码获取当前线程的连接,优化后的代码获取新的连接。所以我问两个线程是否可以同时保持一个连接。如果允许,那么正如 Mark Rottelveel 所说,代码不健壮。如果没有,这个优化似乎不是很有用。通过你的解释,我是否可以理解,因为 Spring 可以使用不同的 DataSource 和不同的连接分配策略,所以可能有一种策略允许线程共享连接,对吧?
    • @kongtianyi。同样,在多个线程之间使用连接是一个坏主意。在提供的代码中,开发人员默认为 true(这意味着为不同的线程使用不同的连接),但如果有人想要这样做,请留下另一个选项。
    • @AlanSereb我问题的关键是Spring中的线程是否可以同时共享连接。如果没有,即使作者不优化,代码仍然会使用当前线程的连接,不会出现事务冲突。从你提供的link,可能有允许连接共享的策略,所以谢谢你的答案。
    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 2015-02-02
    • 2018-12-20
    • 2021-12-26
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多