我有4个线程以并发方式运行(在数据库中插入/选择行),我是否必须关心同步访问或H2 Databse已经有机制来管理线程之间的访问?PS:Connection conn变量在线程之间共享,因此连接是一次,因为我使用嵌入模式,因此只允许一...
我有4个线程以并发方式运行(在数据库中插入/选择行),
我是否必须关心同步访问或H2 Databse已经有机制来管理线程之间的访问?
PS:Connection conn变量在线程之间共享,因此连接是一次,因为我使用嵌入模式,因此只允许一个连接.
干杯.
解决方法:
这里有两个可能的问题.一个是连接对象是线程安全的(意味着并发调用不会将对象置于错误状态),另一个是粒度(内置同步是否适合您的需要).
根据H2’s documentation:
Thread safety: the connection is thread-safe, because access is
synchronized. However, for compatibility with other databases, a
connection should only be used in one thread at any time.
就H2而言,同时从多个线程访问连接应该没问题. (它不会很快,因为线程将排队等待获得连接,但是由于竞争条件导致事情被破坏,连接对象不会遭受某种破坏.)这里的警告是,如果你想要的话要使用与其他数据库相同的代码,你不应该依赖其他数据库的同步,就像H2那样:即使JDBC规范要求连接是线程安全的(可能,我不记得),某些驱动程序可能不是兼容.
此时,如果您不关心事务并且只需要自动提交(意味着每个JDBC调用都是单独提交的)那么您就可以了(但是在使用自动提交时关于结果集关闭的注释中请参阅Mark R的观点).但是,如果要将多个JDBC调用分组到事务中(将autocommit设置为false并在连接上调用commit),那么您将希望自己管理对连接的访问??(让线程专门获取连接,运行JDBC语句,然后调用commit,然后释放连接上的锁定,以便您可以控制进入事务的内容.否则,当您在连接上调用commit时,无法确定哪些线程的工作正在提交.
最安全的途径是同步访问整个工作单元.考虑让您的线程排队他们的SQL命令,并让它们由唯一访问该连接的专用线程处理.
本文标题为:java – 我是否需要管理有关数据库访问的并发性?
基础教程推荐
- jsp使用sessionScope获取session案例详解 2023-07-30
- Java 在 Array 和 Set 之间进行转换的示例 2023-07-14
- Java通过Freemarker模板实现生成Word文件 2023-05-24
- Java利用过滤器实现完善登录功能 2023-05-24
- Spring Quartz2 动态任务的实例详解 2023-08-01
- mybatis collection和association的区别解析 2023-03-06
- SpringCloud eureka(server)微服务集群搭建过程 2023-02-11
- 将properties文件的配置设置为整个Web应用的全局变量实现方法 2023-07-30
- Mybatis-Plus实现公共字段自动赋值的方法 2023-02-11
- Java多线程事务回滚@Transactional失效处理方案 2023-04-06