如果我有一个带有静态方法的util类,它将调用Hibernate函数来完成基本数据访问.我想知道使用方法synchronized是否是确保线程安全的正确方法.

我想这样做是为了防止信息访问同一个DB实例.然而,我现在可以确定,当特定类调用getObjectById时,下面的代码是否阻止了所有类调用getObjectById.

public class Utils {
     public static synchronized Object getObjectById (Class objclass, Long id) {
           // call hibernate class
         Session session = new Configuration().configure().buildSessionFactory().openSession();
         Object obj = session.load(objclass, id);
         session.close();
         return obj;
     }

     // other static methods
}

推荐答案

通过在静态方法锁上使用synchronized,您将获得synchronize the class methods and attributes(与实例方法和属性相反)

所以你的假设是正确的.

I am wondering if making the method synchronized is the right approach to ensure thread-safety.

不是真的.你应该让你的RDBMS来做这件事.他们擅长这种东西.

通过同步对数据库的访问,您将获得的唯一结果是使您的应用程序变得非常慢.此外,在您发布的代码中,您每次都要构建一个会话工厂,这样,您的应用程序访问数据库所花费的时间将比执行实际作业(job)所花费的时间更多.

想象一下下面的场景:

客户端A和Btry 将不同的信息插入到表T的记录X中.

使用您的方法,您得到的唯一结果就是确保一个接一个地调用,而这在DB中无论如何都会发生,因为RDBMS将防止他们同时插入来自A和B的一半信息.结果是一样的,只是慢了5倍(或更多).

也许最好看看Hibernate文档中的"Transactions and Concurrency"章.大多数时候,你试图解决的问题已经解决了,而且是一种更好的方式.

Java相关问答推荐

如何跟踪我在数组中的位置

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

无法在Java中将hhmmss格式的时间解析为LocalTime

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

ApachePOI:不带换行的新行

Junit with Mockito for java

如何找到MongoDB文档并进行本地化?

JavaFX如何在MeshView中修复多个立方体?

我正在try 跟踪数组中最大的两个数字

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

如何在EXCEL单元格中添加形状和文本

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

为什么Collectors.toList()不能保证易变性

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

如何用Micrometer&;斯普肯

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别