@PersistenceContext 线程安全的疑问

在spring+jpa情况下,经常这么写service层或dao层

[code="java"]
public class BrandServiceDao implements BrandDao {

@PersistenceContext
protected EntityManager entityManager;

// business 

}
[/code]
一般service和dao都被是singleton 但这种情况下,
entityManager没有线程安全问题么
或者说这么证明不同线程拿到的entityManager是不同的实例对象

我自己做了下模拟,也许方式不对,拿到的entityManager(代理对象)的hashcode都是一样的
嗯 原模原样的输出是:
[code="java"]Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalEntityManagerFactoryBean@1b64ef8][/code]
共享的entityManager代理?

1个回答

entityManager 线程不安全的

共享的entityManager代理?
你猜对了 spring提供了EntityManager 的 代理 EntityManagerProxy

SharedEntityManagerCreator来创建代理

return (EntityManager) Proxy.newProxyInstance(
(cl != null ? cl : SharedEntityManagerCreator.class.getClassLoader()),
ifcs, new SharedEntityManagerInvocationHandler(emf, properties));

God_lamb_1
Vary_ 嗯,谢谢啦。
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 意思就是说 此处其实创建了一个共享的代理对象 (所以只有一个) 因此hashcode都是一样的 但是实际使用时 会根据实际需要创建真实的EntityManager
7 年多之前 回复
God_lamb_1
Vary_ 您的意思是说,entityManager开始只是一个实现了EntityManager接口的代理对象,实际的创建对象被延时了,而之所以我们取得的entityManager的hashcode是一致的,是因为这个代理对象实际上是无状态的只是负责延后entityManager的创建,可以被设计为单例,而我们取得的指是该代理对象么,真正的对象被代理隐藏了。 不知道是这样么 我学生党,英语不好,看API和reference好困难,有什么建议么 shared transactional EntityManager proxy这句我都不太懂... 共享事务的EntityManager代理?......
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 如你所说 注入的是代理对象 每次当spring需要开启时 会创建一个绑定到threadlocal 和session类似
7 年多之前 回复
God_lamb_1
Vary_ 既然这里的entityManager是线程不安全的,那为什么还要这样使用它? entityManager不应该是无状态对象吧
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐