- 浏览: 282095 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (121)
- jsf (16)
- 技术 (1)
- seam (27)
- jpa/hibernate (6)
- seam-对话 (3)
- 复用组件 (1)
- java基础 (18)
- JBOSS (1)
- Facelets (3)
- EL表达式 (2)
- 正则表达式 (1)
- sogi (2)
- 工具 (2)
- 设计模式/重构 (2)
- 项目管理-maven (5)
- EJB (1)
- ClassLoader (2)
- eclipse (1)
- jQuery (0)
- seam2源码分析 (0)
- osgi (0)
- TEST (0)
- 日志记录 (1)
- 批处理工作流 (0)
- 业务需求 (0)
- 语言 (2)
- 架构 (2)
- svn (1)
- sql (1)
- 异常处理 (1)
- mybatis (2)
- http (2)
- 代码可读性 (3)
- 配置化 (0)
- 错误恢复 (0)
- 状态查询 (1)
- 误操作恢复 (0)
- 工作安排 (0)
- 自动化 (0)
- 解耦 (1)
- 交流 (1)
- spring (6)
- 代码质量 (2)
- 方案 (1)
- 分布式 (1)
- mvc (2)
最新评论
-
luchuanbaker:
经过测试,实际上,mybatis并没有此问题,我也碰到了这样的 ...
mybatis 异常不友好 举例 -
huang882088:
jboss的war发布到tomcat里报这个错误怎么办?
classloader常见问题总结 -
yourenyouyu2008:
大型,可持续扩展的系统适合使用静态语言。大型系统中的部分地方可 ...
Nuxeo公司探秘:从Python迁移到Java -
yourenyouyu2008:
既然Nuxeo同时使用了Pytho ...
Nuxeo公司探秘:从Python迁移到Java -
panshunchang:
还有一种可能,真的缺这个jar包,在tomcat lib目录下 ...
classloader常见问题总结
seam中有两种事务管理方式,1)页面请求自动开启、关闭事务,不需要在代码上做任务额外处理;2)通过@Transactional注释在类或方法上增加事务。
第1种是在jsf的PhaseListener(SeamPhaseListener)中实现的,阶段中调用业务方法,阶段后在SeamPhaseListener中根据事务的状态来决定提交还是回滚事务。事务的状态是如何更改的呢?阶段前开始事务后事务的状态是active的,阶段中调用业务方法如果产生异常会改变事务的状态为Rollback,否则事务状态还是active的。由于阶段后不能捕获阶段中的异常,所以通过RollbackInterceptor 拦截器来让业务方法失败后改变事务状态。不是任何异常都会改变事务状态,如下异常才会改变事务状态。
1)所有不带@javax.ejb.ApplicationException或@ApplicationException(seam的)的RuntimeException
2)不包括jsf 的ValidatorException和ConverterException
3)所有带@javax.ejb.ApplicationException或@ApplicationException(seam的),并且rollback=ture的任何Exception
第2种在方法上增加拦截,如果方法本身抛出异常,根据上面的3种异常情况决定是提交还是回滚事务,如果方法捕获了调用其它组件的方法抛出的异常,也可能会导致事务回滚,其它组件的方法中抛出的异常是通过RollbackInterceptor 拦截器来改变事务状态的,这种情况与第1种事务管理方式一样。
//加在每个可拦截的方法上
@Interceptor(stateless=true)
public class RollbackInterceptor extends AbstractInterceptor
{
private static final long serialVersionUID = 5551801508325093417L;
@AroundInvoke
public Object aroundInvoke(InvocationContext invocation) throws Exception
{
try
{
return invocation.proceed();
}
catch (Exception e)
{
if ( isRollbackRequired(e, getComponent().getType() == JAVA_BEAN) )
{
try
{
Transaction.instance().setRollbackOnly();//设置当前事务(底层事务)回滚
}
catch (Exception te) {} //如果当前线程没有活动的事务,忽略任何异常
}
throw e;
}
}
public boolean isInterceptorEnabled()
{
// Just here for consistency
return true;
}
}
总结:默认情况下方法中抛出的runtimeException会导致事务回滚,检查时异常不会导致事务回滚,在异常类型不能改变的情况下通过@javax.ejb.ApplicationException或@ApplicationException(seam的)的rollback来决定是否需要回滚事务。
如下异常可能就是因为忽略了runtimeException导致的。
2013-01-04 14:50:10,709 ERROR [org.hibernate.util.JDBCExceptionReporter] Transaction is not active: tx=TransactionImple < ac, BasicAction: -53ee3e68:e32b:50e0f672:2d76 status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -53ee3e68:e32b:50e0f672:2d76 status: ActionStatus.ABORT_ONLY >)
2013-01-04 14:50:10,709 INFO [org.hibernate.event.def.DefaultLoadEventListener] Error performing load command
org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:842)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:835)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182)
at sun.reflect.GeneratedMethodAccessor761.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.seam.persistence.EntityManagerInvocationHandler.invoke(EntityManagerInvocationHandler.java:46)
at $Proxy174.find(Unknown Source)
at org.iata.ios.core.dao.BaseDao.find(BaseDao.java:82)
at org.iata.seurat.app.systemadmin.user.dao.UserDao.getLoginUser(UserDao.java:48)
发表评论
-
spring seam比较
2014-01-14 14:06 9191)获取框架中的bean spring通过静态方法中传递 ... -
Nuxeo公司探秘:从Python迁移到Java
2013-07-21 10:57 1046成立于2000年的Nuxeo公 ... -
自定义组件问题
2013-03-01 10:14 01)ios:dataTable组件中不加buttonPane ... -
使用JTA的事务同步机制实现分布式事务j的功能avax.transaction.Synchronization
2012-12-05 18:43 0分布式事务强大功能,但也会带来性能和管理上的压力(这是听专家门 ... -
seam中的test
2012-04-25 11:25 0seam中提供了一些非seam环境下的unit testing ... -
Hibernate的FlushMode 和seam对话中的FlushMode
2012-02-21 17:29 0hibernate提供了5种flushmode。 1) NE ... -
seam 中的注释分类
2012-02-14 11:08 0seam中注释主要分为2大类,seam组件对象构造阶段的注释和 ... -
seam2 热部署
2011-09-30 10:25 1165seam能很好地支持 页面(faceslet)、非ejb cl ... -
使用长对话的"manual" flush-mode ,多操作一次提交
2011-03-24 10:27 1520一次长对话访问中可以包括多个页面,每个页面只处理部分数据,但不 ... -
seam 属性配置与installed="false"的冲突
2011-03-08 15:09 1094问题 在测试和运行环境使用不同的事务配置,默认不需要指定事务 ... -
最简单的richfaces tree使用方式
2010-10-30 12:54 2323richfaces tree提供的示例都是一次全部构造出树,对 ... -
page scope介绍及用途
2010-06-02 00:13 6258jsf1.2只提供了3中作用域,application、ses ... -
seam框架中@Unwrap的使用示例
2009-09-07 10:07 16311) 把FacesContext当seam组件使用,可以直接 ... -
基于seam技术的中文网站
2009-09-05 16:28 1325基于seam的中文网站,欢迎大家提供实际的seam项目 ht ... -
在seam项目启动后执行数据库操作
2009-07-15 15:33 1753项目启动时执行些初始化数据操作,问题是事务不能提交,这样虽然方 ... -
基于seam-gen的热部署(hot deploy)相关问题
2009-07-06 12:04 1465使用seam-gen生成的seam项目是支持热部署的。 ... -
提升jsf/seam性能
2009-05-23 22:07 1407转载:http://www.jsfcentral.com/ar ... -
根据组件名字获取组件对象Component.getInstance(String name)
2009-05-05 22:02 3982Component.getInstance(String ... -
components.xml 配置seam组件
2009-04-29 12:21 2386components.xml 的配置采用反射机制来实现,组件类 ... -
下拉框的国际化
2009-04-22 17:32 2064<f:selectItem itemLabel=&quo ...
相关推荐
SEAM 中文开发指南(官方)
个人收集整理的最全面seam文档 包括seam_reference(中、英) richfaces jsf a4j 以及seam一些其他主要功能
seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。
Seam 中文开发指南 seam中文文档
seam框架需要的所有jar包,支持seam ui组件
JBOSS SEAM组件中文手册 Seam_2.0_Reference_zh_CN
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
seam下一代web开发框架
seam in action 中文 english seam提供了快速开发 好长。netjava 新手学习的利器 中英文各一本,英文的好像不是很好
JBoss_Seam--中文、Seam教程,中文Seam针对初学者很好的讲解及实例。希望对您有所收获。
Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几个定 良好的上下文中任何一个相 的状 , 包括长开间运行上 下文、持久化上下文、业务流程...
Jboss_seam 中英文文档
seam中的注解总结,包括三种JPA和seam自身的标签
seam_carving代码实现 图像缩放
1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................
java JbossSeam中文开发指南
Jboss Seam中文参考手册,通过大量的实例详细介绍seam的使用
最新SEAM参考文档中文版,12.30翻译
seam in action seam in action seam in action seam in action seam in action seam in action seam in action
• 身份管理 - 用于管理Seam程序中所涉及的用户及角色的接口 • 权限验证 - 一个应用十分广泛的权限验证框架,支持用户角色、持久化和基于规则的权限设置,能够灵活地实现属于用户自己的安全设置 • 权限管理 - 一组...