当前位置: 首页 > news >正文

泰州城乡建设局网站网站维护中 源码

泰州城乡建设局网站,网站维护中 源码,戴尔网站建设成功的关键,北京的电商平台网站有哪些JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理。如果在依赖注入容器之外使用JPA#xff0c;事务处理必须由开发人员编程实现。 UserTransaction utx entityManager.getTransaction(); try { utx.begin(); businessLogic();utx.commit(); } catch(…JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理。如果在依赖注入容器之外使用JPA事务处理必须由开发人员编程实现。 UserTransaction utx entityManager.getTransaction(); try { utx.begin(); businessLogic();utx.commit();  } catch(Exception ex) { utx.rollback(); throw ex;  } 这种方式的事务管理使事务范围可以在代码中很清晰地表达出来但它有以下缺点 容易出现重复代码和错误 任何错误可能产生较大的影响 错误难以调试和复现 降低了代码库的可读性 如果该方法调用了其他的事务方法如何处理呢 使用Spring Transactional 使用Spring Transactional上面的代码就简化为 Transactional public void businessLogic() { ... use entity manager inside a transaction ... } 代码更加简洁可读性更好也是目前Spring中事务处理的推荐方式。 通过使用Transactional事务传播等很多重要方面可以自动处理。这种情况下如果businessLogic()调用了其他事务方法该方法将根据选项确定如何加入正在运行事务。 这个强大机制的一个潜在缺点是它隐藏了底层的运行当它不能正常工作时很难调试。 Transactional含义 关于Transactional关键点之一是要考虑两个独立的概念它们都有各自的范围和生命周期 persistence context(持久化上下文)database transaction事务 Transactional本身定义了单个事务的范围。这个事务在persistence context的范围内。 JPA中的持久化上下文是EntityManager内部实现使用了Hibernate Session使用Hibernate作为持久化provider。 持久化上下文仅仅是一个同步对象它记录了有限集合的Java对象的状态并且保证这些对象的变化最终持久化到数据库。 这是与单个事务非常不同的概念。一个Entity Manager可以跨越多个事务使用而且的确是这样使用的。 EntityManager何时跨越多个事务 最常见的情况是应用使用Open Session In View模式处理懒初始化异常时之前的文章介绍过这种做法的优势和劣势。 这种情况下视图层运行的多个查询处于独立的事务中而不是单事务的业务逻辑但这些查询由相同的entity manager管理。 另一种情况是开发人员将持久化上下文标记为PersistenceContextType.EXTENDED这表示它能够响应多个请求。 如何定义EntityManager和Transaction之间的关系 这由应用开发者来选择但是JPA Entity Manager最常用的方式是“Entity Manager per application transaction”(每个事务都有自己的实体管理器)模式。entity manager注入的常用方法是 PersistenceContext private EntityManager em; 这里默认为“Entity Manager per transaction”模式。这种模式下如果在Transactional方法内部使用该Entity Manager那么该方法将在单一事务中运行。 PersistenceContext如何工作 随之而来的问题就是PersistenceContext如何仅在容器启动时注入entity manager假定entity manager生命周期很短暂而且每次请求需要多个entity manager。 答案是它不能EntityManager是一个接口注入到spring bean中的不是entity manager本身而是在运行时代理具体entity manager的context aware proxy上下文感知代理。 通常用于代理的具体类为SharedEntityManagerInvocationHandler借助调试器可以确认这一点。 那么Transactional如何工作 实现了EntityManager接口的持久化上下文代理并不是声明式事务管理的唯一部分事实上包含三个组成部分 EntityManager Proxy本身事务的切面事务管理器 看一下这三部分以及它们之间的相互作用。 事务的切面 事务的切面是一个“around环绕”切面在注解的业务方法前后都可以被调用。实现切面的具体类是TransactionInterceptor。 事务的切面有两个主要职责 在’before’时切面提供一个调用点来决定被调用业务方法应该在正在进行事务的范围内运行还是开始一个新的独立事务。 在’after’时切面需要确定事务被提交回滚或者继续运行。 在’before’时事务切面自身不包含任何决策逻辑是否开始新事务的决策委派给事务管理器完成。 事务管理器 事务管理器需要解决下面两个问题 新的Entity Manager是否应该被创建 是否应该开始新的事务 这些需要事务切面’before’逻辑被调用时决定。事务管理器的决策基于以下两点 事务是否正在进行 事务方法的propagation属性比如REQUIRES_NEW总要开始新事务 如果事务管理器确定要创建新事务那么将 创建一个新的entity manager entity manager绑定到当前线程 从数据库连接池中获取连接 将连接绑定到当前线程 使用ThreadLocal变量将entity manager和数据库连接都绑定到当前线程。 事务运行时他们存储在线程中当它们不再被使用时事务管理器决定是否将他们清除。 程序的任何部分如果需要当前的entity manager和数据库连接都可以从线程中获取。 EntityManager proxy EntityManager proxy(前面已经介绍过)就是谜题的最后一部分。当业务方法调用entityManager.persist()时这不是由entity manager直接调用的。 而是业务方法调用代理代理从线程获取当前的entity manager前面介绍过事务管理器将entity manager绑定到线程。 了解了Transactional机制的各个部分我们来看一下实现它的常用Spring配置。 整合三个部分 如何将三个部分组合起来使事务注解可以正确地发挥作用呢首先定义entity manager工厂。 这样就可以通过持久化上下文注解注入Entity Manager proxy。 Configuration public class EntityManagerFactoriesConfiguration {Autowiredprivate DataSource dataSource;Bean(name entityManagerFactory)public LocalContainerEntityManagerFactoryBean emf() {LocalContainerEntityManagerFactoryBean emf ...emf.setDataSource(dataSource);emf.setPackagesToScan(new String[] {your.package});emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());return emf;} } 下一步实现配置事务管理器和在Transactional注解的类中应用事务的切面。 Configuration EnableTransactionManagement public class TransactionManagersConfig {AutowiredEntityManagerFactory emf;Autowiredprivate DataSource dataSource;Bean(name transactionManager)public PlatformTransactionManager transactionManager() {JpaTransactionManager tm  new JpaTransactionManager();tm.setEntityManagerFactory(emf);tm.setDataSource(dataSource);return tm;} } 注解EnableTransactionManagement通知SpringTransactional注解的类被事务的切面包围。这样Transactional就可以使用了。 总结 Spring声明式事务管理机制非常强大但它可能被误用或者容易发生配置错误。 当这个机制不能正常工作或者未达到预期运行结果等问题出现时理解它的内部工作情况是很有帮助的。 需要记住的最重要的一点是要考虑到两个概念事务和持久化上下文每个都有自己不可读的明显的生命周期。
http://www.zqtcl.cn/news/871511/

相关文章:

  • 关于网站建设心得体会网站的功能包括哪些
  • 番禺网站制作技术网站建设与管理pdf
  • 毕业设计做网站选题营销型网站功能模块
  • 西部数码网站管理助手安装建工教育网
  • wordpress 网站logowordpress文本编辑器插件
  • 杭州装饰网站建设如何免费建购物网站
  • 在vs做的项目怎么连接到网站珠海有什么网站
  • 网上购物网站建设论文6做的网站必须放在idc机房吗
  • 基于asp.net的视频网站开发500套wordpress模板
  • 商城模板建站价格寻找专业网站建设
  • 网址我的上网主页seo培训中心
  • 上海建网站服务器河南网站推广优化排名
  • 夸克作文网站淄博团购网站建设
  • 家居类企业响应式网站一个很好的个人网站开发
  • 推荐网站建设服务器百度竞价入口
  • 微信如何做网站100个成功营销策划案例
  • 手机网站分享js代码外贸网站做几种产品
  • 文化网站建设论文wordpress模板打包
  • 学校网站查询做网站 先上线再调整
  • 如何制作一个好网站培训教育网站开发
  • 杭州市网站seo网站微信建设
  • 做购物网站 需要手续安徽科技学院
  • 网站顶部下拉广告网页游戏设计培训学校
  • 做seo的网站是怎么样的wordpress访问地图
  • 国外psd免费下载网站公司网站设计的公司
  • jsp sql 网站开发天津建站管理系统信息
  • 网站建设教程搭建浊贝湖南岚鸿给力企业网站定制公司
  • 网站建设与数据库维护 pdf廊坊seo关键字排名
  • 十元精品店做网站微信开发网站制作
  • 做乡镇网站地图上搜索不到的公司正规吗