【发布时间】:2010-05-13 16:08:21
【问题描述】:
我定义了一个 AnnotationSessionFactoryBean 类型的 bean 用于 web-app。
如果我没有明确定义为NOT单例,那它一定是单例的。
现在,它绑定到当前线程。
这意味着它不能是单例。
附言Factory 生成的 Session 不是单例,而 SessionFactory 始终是单例。现在一切都清楚了!
【问题讨论】:
标签: java hibernate spring session
我定义了一个 AnnotationSessionFactoryBean 类型的 bean 用于 web-app。
如果我没有明确定义为NOT单例,那它一定是单例的。
现在,它绑定到当前线程。
这意味着它不能是单例。
附言Factory 生成的 Session 不是单例,而 SessionFactory 始终是单例。现在一切都清楚了!
【问题讨论】:
标签: java hibernate spring session
AnnotationSessionFactoryBean(它的超类)定义了返回 true 的 isSingleton() 方法。所以这个工厂bean返回的SessionFactory是单例的。
另一方面,SessionFactory 生成的Session 可能是线程绑定的。
所以你有:
BeanFactory creates SessionFactory creates Session
【讨论】:
AnnotationSessionFactoryBean 的超类称为LocalSessionFactoryBean 有一些ThreadLocal<?> 静态字段:
private static final ThreadLocal<DataSource> configTimeDataSourceHolder =
new ThreadLocal<DataSource>();
private static final ThreadLocal<TransactionManager> configTimeTransactionManagerHolder =
new ThreadLocal<TransactionManager>();
private static final ThreadLocal<Object> configTimeRegionFactoryHolder =
new ThreadLocal<Object>();
private static final ThreadLocal<CacheProvider> configTimeCacheProviderHolder =
new ThreadLocal<CacheProvider>();
private static final ThreadLocal<LobHandler> configTimeLobHandlerHolder =
new ThreadLocal<LobHandler>();
因此,即使是这个 bean 的单个实例,在不同线程中的交互也可能不同。
【讨论】: