同步静态方法如何在Java中工作,我可以使用它来加载Hibernate实体吗? [英] How do synchronized static methods work in Java and can I use it for loading Hibernate entities?

查看:85
本文介绍了同步静态方法如何在Java中工作,我可以使用它来加载Hibernate实体吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

If I have a util class with static methods that will call Hibernate functions to accomplish basic data access. I am wondering if making the method synchronized is the right approach to ensure thread-safety.

我希望这可以防止对同一数据库实例的信息访问.但是,我现在确定以下代码是否阻止在特定类调用getObjectById时为所有类调用.

I want this to prevent access of info to the same DB instance. However, I'm now sure if the following code are preventing getObjectById being called for all Classes when it is called by a particular class.

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
}

推荐答案

通过在静态方法锁上使用同步,您将

By using synchronized on a static method lock you will synchronize the class methods and attributes ( as opposed to instance methods and attributes )

所以您的假设是正确的.

So your assumption is correct.

我想知道使方法同步是确保线程安全的正确方法.

并非如此.您应该让该工作代替您的RDBMS.他们擅长这类东西.

Not really. You should let that work do your RDBMS instead. They are good at this kind of stuff.

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

The only thing you will get by synchronizing the access to the database is to make your application terribly slow. Further more, in the code you posted you're building a Session Factory each time, that way, your application will spend more time accessing the DB than performing the actual job.

想象一下以下情况:

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

Client A and B attempt to insert different information into record X of table T.

使用您的方法,唯一要确保的是确保在数据库中无论如何都会调用另一个,因为RDBMS将阻止它们在A处插入来自A的一半信息,从B插入一半的信息.同一时间.结果将是相同的,但仅慢5倍(或更多).

With your approach the only thing you're getting is to make sure one is called after the other, when this would happen anyway in the DB, because the RDBMS will prevent them from inserting half information from A and half from B at the same time. The result will be the same but only 5 times ( or more ) slower.

最好看看 Hibernate文档中的交易和并发"一章.在大多数情况下,您要解决的问题已经得到解决,并且是一种更好的方法.

Probably it could be better to take a look at the "Transactions and Concurrency" chapter in the Hibernate documentation. Most of the times the problems you're trying to solve, have been solved already and a much better way.

这篇关于同步静态方法如何在Java中工作,我可以使用它来加载Hibernate实体吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆