在我们的应用程序中,我们使用Spring和Hibernate.
在所有DAO类中,我们自动连接SessionFactory,每个DAO方法都调用getCurrentSession()方法.
问题我有为什么不在原型范围中注入Session对象而不是SessionFactory对象?这将节省我们对getCurrentSession的调用.
我认为第一种方法是正确的,但寻找第二种方法会抛出错误或可能性能不佳的具体情况?
当您将 bean 定义为原型范围时,将为需要注入它的每个位置创建一个新实例。因此,每个 DAO 将获得不同的 Session 实例,但 DAO 上的所有方法调用最终都将使用相同的会话。由于会话不是线程安全的,因此不应在多个线程之间共享,这将是一个问题。
对于大多数情况,会话应该是事务范围,即,当事务开始时打开一个新会话,然后在事务完成后自动关闭。在某些情况下,它可能必须扩展到请求范围。
如果您想避免使用 SessionFactory.currentSession - 那么您将需要定义自己的范围实现来实现这一点。
这是已经使用代理为 JPA 实现的东西。在 JPA 的情况下,注入 EntityManager 而不是 EntityManagerFactory。有一个新的 @PersistenceContext 注释代替了 @Autowired。代理在初始化期间创建并注入。当调用任何方法时,代理将获取实际的 EntityManager 实现(使用类似于 SessionFactory.getCurrentSession 的东西)并委托给它。
Hibernate 也可以实现类似的事情,但额外的复杂性是不值得的。在 BaseDAO 中定义 getSession 方法要简单得多,该方法内部调用 SessionFactory.getCurrentSession()。这样,使用会话的代码与注入会话相同。
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |