加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JDBC事务与连接澄清

发布时间:2020-12-14 17:46:06 所属栏目:Java 来源:网络整理
导读:我正在使用JDBC与我的Postgres数据库进行交谈.如果我的整个应用程序运行一个单一的连接,即只有一个呼叫; DriverManager.getConnection("jdbc:postgresql://host:5432/database",user,pass); 但是这个Connection对象在Java中的多个线程之间是共享的,我假定任
我正在使用JDBC与我的Postgres数据库进行交谈.如果我的整个应用程序运行一个单一的连接,即只有一个呼叫;
DriverManager.getConnection("jdbc:postgresql://host:5432/database",user,pass);

但是这个Connection对象在Java中的多个线程之间是共享的,我假定任何使用SQL事务(BEGIN和COMMIT样式)的尝试只会变得非常混乱和破坏,因为Java线程可能会交错? Connection对象“知道”哪个Java线程正在使用它进行查询?

我应该每个Java线程有一个Connection对象,并以这种方式使用SQL事务吗?还是应该使用synchronized来执行Java中的所有事务隔离?

解决方法

只要详细说明现有答案:

PgJDBC’s Connection object is thread-safe,但只在一个语句级别.在自动提交模式下使用多个线程时不会崩溃或产生错误的结果,但不会为您隔离不同线程的事务.根据文档,您需要使用连接池.

实际上有很多方法可以在多个线程之间使用连接:

>使用从中获取连接的内部连接池,执行与它们的配合,并将其返回到池中.对于大多数应用来说,这是非常好的选择. Java存在许多JDBC连接池实现,所以不要自己滚动. dbcp和c3p0是两个流行的实现,但是如果您使用的是servlet环境或应用服务器,则通常应使用服务器的连接池而不是自带的.
>使用外部连接池,如pgbouncer或pgpool-II,并自由打开/关闭连接.这稍微慢一点,大部分是应用程序无法或因各种原因而不能内部连接连接的选项.您可能不需要这样做,除非您需要将总计连接数限制到数据库,并在多个应用程序或应用程序实例之间共享它们.
>不要使用游泳池并自由打开/关闭连接.这是非常低效的.不要这样做
>使用线程本地存储保持每个线程的连接.这将工作,但它是非常低效的,因为每个开放的连接在空闲时绑定数据库服务器资源.不要这样做,除非在事务池模式下使用像PgBouncer这样的外部连接池,在这种情况下可以.
>仅使用单个连接并在同步块中包装事务,并在连接实例上进行同步.这将工作,并将有效使用数据库连接,但将限制您的线程的性能.除玩具/便利应用程序外,通常不是一个好的设计.
>仅使用单独的连接与自己的专用线程.有其他连接通过FIFO队列,生产者/消费者风格传递描述要完成的工作的数据结构.如果线程花费大部分时间执行CPU重或其他非数据库工作,并且只需要有限的数据库访问,这将起作用.很多使用它而不是使用连接池的唯一原因是如果您被限制为使用单个连接的一些外部原因,但如果你是一个可观的选择.

一般来说,尽管如此,你应该使用一个连接池并完成它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读