java如何使用Hibernate JPA线程安全进行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();
// ...
}
}
- 使add()、delete()、update()和getAll()方法同步就足够了吗李>
- 我可以像在我的源代码中那样创建多个DbService实例吗?还是只需要创建一个实例李>
- 也许我应该使用singleton设计模式?或者使用所有方法使DbService保持静态李>
# 1 楼答案
不需要同步任何东西
entityManager不是线程安全的,其设计目的是为每个工作单元实例化,并在之后立即销毁
相反,创建工厂的成本很高,应该重复使用
请参阅http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html“应用程序管理的实体管理器” 和https://stackoverflow.com/a/22773758/2087640
# 2 楼答案
您不需要同步这些方法,因为它们是线程安全的。是的,把
DbService
变成一个单身汉可能是有道理的。或者,您可以将em
设为静态。单身汉是我的首选。您也不希望em
公开。当你在做的时候,要保密