在进行spring / hibernate调用时控制器会阻塞吗?

时间:2016-03-19 04:08:46

标签: java spring hibernate playframework typesafe-activator

这是从Play和Spring示例的激活器模板创建项目后的控制器。

控制器代码:

@org.springframework.stereotype.Controller
public class Application {

    @Autowired
    private BarService barService;

    public Result addBar() {
        Form<Bar> form = Form.form(Bar.class).bindFromRequest();
        Bar bar = form.get();
        barService.addBar(bar);
        return play.mvc.Controller.redirect(controllers.routes.Application.index());
    }
}

酒吧服务:

@Service
@Transactional
public class BarServiceImpl implements BarService {

    @PersistenceContext
    EntityManager em;

    @Override
    public void addBar(Bar bar) {
        em.persist(bar);
    }

    @Override
    public List<Bar> getAllBars() {
        CriteriaQuery<Bar> c = em.getCriteriaBuilder().createQuery(Bar.class);
        c.from(Bar.class);
        return em.createQuery(c).getResultList();
    }
}

Spring Hibernate配置:

@Configuration
@EnableTransactionManagement
public class DataConfig {

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setShowSql(true);
        vendorAdapter.setGenerateDdl(true);
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setPackagesToScan("models");
        entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactory.setDataSource(dataSource());
        entityManagerFactory.setJpaPropertyMap(new HashMap<String, String>(){{
            put("hibernate.hbm2ddl.auto", "create-drop");
        }});
        entityManagerFactory.afterPropertiesSet();
        return entityManagerFactory.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory());

        return transactionManager;
    }

    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(Play.application().configuration().getString("db.default.driver"));
        dataSource.setUrl(Play.application().configuration().getString("db.default.url"));
        return dataSource;
    }
}

我的问题是,addBar中的控制器调用barService功能是阻塞呼叫吗?如果是,那么在Play应用程序中进行spring / hibernate集成的正确方法应该是什么,考虑到它是来自Typesafe激活器本身的示例代码。

1 个答案:

答案 0 :(得分:1)

是的,它会阻止,因为JDBC没有异步/非阻塞支持。由于Hibernate依赖于JDBC,因此它继承了阻塞行为。这也是documented here

  

此类阻止操作的常见示例包括 JDBC调用,流API,HTTP请求和长计算。

我强烈建议您阅读以下文档页面:

  1. JavaAsync: Handling asynchronous results
  2. Understanding Play thread pools
  3. 我还建议您在这里查看其他非常类似的讨论:

    1. https://stackoverflow.com/a/32784410/4600