gpt4 book ai didi

java - 如何使用 Hibernate JPA 线程安全地访问数据库?

转载 作者:行者123 更新时间:2023-11-29 04:41:24 24 4
gpt4 key购买 nike

我想知道我需要做什么才能使对 DB 的访问线程安全。

这是我的实体类:

@Entity
@Table(name = "students")
@NamedQuery(name = "Student.getAll", query = "SELECT s FROM Student s")
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(length = 32, name = "name")
private String name;

// ... constructor, getters and setters, toString ...
}

这是 DbService 类:

public class DbService {

public EntityManager em = Persistence
.createEntityManagerFactory("MyPersistenceUnit")
.createEntityManager();

public Student add(Student student) {
EntityTransaction tx = em.getTransaction();
tx.begin();
Student studentFromDb = em.merge(student);
tx.commit();
return studentFromDb;
}

public void delete(long id) {
EntityTransaction tx = em.getTransaction();
tx.begin();
em.remove(get(id));
tx.commit();
}

public Student get(long id) {
return em.find(Student.class, id);
}

public void update(Student student) {
EntityTransaction tx = em.getTransaction();
tx.begin();
em.merge(student);
tx.commit();
}

public List<Student> getAll() {
TypedQuery<Student> namedQuery =
em.createNamedQuery("Student.getAll", Student.class);
return namedQuery.getResultList();
}

}

这是一个与 DbService 一起工作的类:

public class SomeDbWorker implements Runnable {
@Override
public void run() {
DbService service = new DbService();

// do something ...
service.add( ... );
service.delete( ... );
service.getAll();
// ...
}
}

  1. add()delete()update()getAll() 是否足够同步方法?
  2. 我可以像在源代码中那样创建多个 DbService 实例吗?还是我只需要创建一个实例?
  3. 也许我应该使用单例设计模式?还是使用所有方法将 DbService 设为静态?

最佳答案

不需要同步任何东西,

entityManager 不是线程安全的,它被设计为为每个工作单元实例化并在之后立即销毁。

相反,工厂的创建成本很高,应该重用

参见 http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html “应用程序管理的实体管理器”和 https://stackoverflow.com/a/22773758/2087640

关于java - 如何使用 Hibernate JPA 线程安全地访问数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com