这是从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();
}
}
@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激活器本身的示例代码。
答案 0 :(得分:1)
是的,它会阻止,因为JDBC没有异步/非阻塞支持。由于Hibernate依赖于JDBC,因此它继承了阻塞行为。这也是documented here:
此类阻止操作的常见示例包括 JDBC调用,流API,HTTP请求和长计算。
我强烈建议您阅读以下文档页面:
我还建议您在这里查看其他非常类似的讨论: