【面试】【Spring常见问题总结】【09】

81、SimpleJdbcTemplate

SimpleJdbcTemplate类也是基于JdbcTemplate类,但利用Java5+的可变參数列表和自己主动装箱和拆箱从而获取更简洁的代码。

SimpleJdbcTemplate主要提供两类方法:query及queryForXXX方法、update及batchUpdate方法。

82、集成Spring JDBC及最佳实践

大多数情况下Spring JDBC都是与IOC容器一起使用。通过配置方式使用Spring JDBC。   并且大部分时间都是使用JdbcTemplate类(或SimpleJdbcTemplate和NamedParameterJdbcTemplate)进行开发。就可以能80%时间使用JdbcTemplate类,而仅仅有20%时间使用其它类开发,符合80/20法则。

Spring JDBC通过实现DaoSupport来支持一致的数据库訪问。SpringJDBC提供例如以下DaoSupport实现:

JdbcDaoSupport:用于支持一致的JdbcTemplate訪问。

NamedParameterJdbcDaoSupport:继承JdbcDaoSupport,同一时候提供NamedParameterJdbcTemplate訪问;

SimpleJdbcDaoSupport:继承JdbcDaoSupport,同一时候提供SimpleJdbcTemplate訪问。

因为JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate类使用DataSourceUtils获取及释放连接,并且连接是与线程绑定的,因此这些JDBC模板类是线程安全的。即JdbcTemplate对象能够在多线程中重用。

83、Spring对ORM的支持

Spring对ORM的支持主要表如今下面方面:

一致的异常体系结构,对第三方ORM框架抛出的专有异常进行包装。从而在使我们在Spring中仅仅看到DataAccessException异常体系。

一致的DAO抽象支持:提供类似与JdbcSupport的DAO支持类HibernateDaoSupport。使用HibernateTemplate模板类来简化经常使用操作。HibernateTemplate提供回调接口来支持复杂操作;

Spring事务管理:Spring对全部数据訪问提供一致的事务管理,通过配置方式,简化事务管理。

Spring还在測试、数据源管理方面提供支持,从而同意方便測试。简化数据源使用。

84、标准SQL规范中定义了四种隔离级别:

未提交读(ReadUncommitted):最低隔离级别。一个事务能读取到别的事务未提交的更新数据,非常不安全。可能出现丢失更新、脏读、不可反复读、幻读。

提交读(ReadCommitted):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读。但可能出现不可反复读、幻读;

可反复读(RepeatableRead):保证同一事务中先后运行的多次查询将返回同一结果,不受其它事务影响。可能可能出现丢失更新、脏读、不可反复读,但可能出现幻读。

序列化(Serializable):最高隔离级别。不同意事务并发运行,而必须串行化运行,最安全。不可能出现更新、脏读、不可反复读、幻读。

隔离级别越高。数据库事务并发运行性能越差。能处理的操作越少。

因此在实际项目开发中为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,虽然不可反复读和幻读不能避免,但能够在可能出现的场合使用悲观锁或乐观锁来解决这些问题。

85、数据库事务类型

数据库事务类型有本地事务和分布式事务:

本地事务:就是普通事务,能保证单台数据库上的操作的ACID,被限定在一台数据库上。

分布式事务:涉及两个或多个数据库源的事务。即跨越多台同类或异类数据库的事务(由每台数据库的本地事务组成的)。分布式事务旨在保证这些本地事务的全部操作的ACID,使事务能够跨越多台数据库;

86、Java事务类型

Java事务类型有JDBC事务和JTA事务:

JDBC事务:就是数据库事务类型中的本地事务,通过Connection对象的控制来管理事务;

JTA事务:JTA指Java事务API(Java TransactionAPI),是Java EE数据库事务规范。 JTA仅仅提供了事务管理接口。由应用程序server厂商(如WebSphere Application Server)提供实现,JTA事务比JDBC更强大,支持分布式事务。

87、Java EE事务类型

Java EE事务类型有本地事务和全局事务:

本地事务:使用JDBC编程实现事务;

全局事务:由应用程序server提供,使用JTA事务;

88、按是否通过编程实现事务

按是否通过编程实现事务有声明式事务和编程式事务;

声明式事务: 通过注解或XML配置文件指定事务信息;

编程式事务:通过编写代码实现事务。

89、Spring提供的事务管理

Spring框架最核心功能之中的一个就是事务管理,并且提供一致的事务管理抽象,这能帮助我们:

提供一致的编程式事务管理API,无论使用Spring JDBC框架还是集成第三方框架使用该API进行事务编程;

无侵入式的声明式事务支持。

Spring支持声明式事务和编程式事务事务类型。

90、Spring对编程式事务的支持

Spring中的事务分为物理事务和逻辑事务。

物理事务:就是底层数据库提供的事务支持,如JDBC或JTA提供的事务;

逻辑事务:是Spring管理的事务。不同于物理事务,逻辑事务提供更丰富的控制,并且假设想得到Spring事务管理的优点,必须使用逻辑事务,因此在Spring中假设没特别强调一般就是逻辑事务;

逻辑事务即支持很低级别的控制。也有高级别解决方式:

低级别解决方式

工具类:使用工具类获取连接(会话)和释放连接(会话),如使用org.springframework.jdbc.datasource包中的ConnectionUtils类来获取和释放具有逻辑事务功能的连接。

当然对集成第三方ORM框架也提供了类似的工具类,如对Hibernate提供了SessionFactoryUtils工具类,JPA的EntityManagerFactoryUtils等,其它工具类都是使用类似***Utils命名;

//获取具有Spring事务(逻辑事务)管理功能的连接
DataSourceUtils.getConnection(DataSource dataSource)
//释放具有Spring事务(逻辑事务)管理功能的连接
DataSourceUtils.releaseConnection(Connection con, DataSource)

TransactionAwareDataSourceProxy:使用该数据源代理类包装须要Spring事务管理支持的数据源,该包装类必须位于最外层,主要用于遗留项目中可能直接使用数据源获取连接和释放连接支持或希望在Spring中进行混合使用各种持久化框架时使用。其内部实际使用ConnectionUtils工具类获取和释放真正连接。

<!--使用该方式包装数据源。必须在最外层,targetDataSource 知道目标数据源-->
<bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <property name="targetDataSource" ref="dataSource"/>
</bean>

通过如上方式包装数据源后,能够在项目中使用物理事务编码的方式来获得逻辑事务的支持。即支持直接从DataSource获取连接和释放连接,且这些连接自己主动支持Spring逻辑事务;

高级别解决方式

模板类:使用Spring提供的模板类。如JdbcTemplate、HibernateTemplate和JpaTemplate模板类等,而这些模板类内部事实上是使用了低级别解决方式中的工具类来管理连接或会话。

Spring提供两种编程式事务支持:直接使用PlatformTransactionManager实现和使用TransactionTemplate模板类,用于支持逻辑事务管理。假设採用编程式事务推荐使用TransactionTemplate模板类和高级别解决方式。

时间: 2024-10-10 02:42:48

【面试】【Spring常见问题总结】【09】的相关文章

Struts+Hibernate+Spring常见问题

http://wanglihu.iteye.com/blog/1897718 1.java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor缺少asm-3.3.jar2.java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor缺少asm-commons-3.3.jar3.java.lang.ClassNotFoundException: org.s

【面试】【Spring常见问题总结】【01】

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin

【面试】【Spring常见问题总结】【07】

61.Spring IoC容器的依赖有两层含义: Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IoC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系. 容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean.外部文件.常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的

【面试】【Spring常见问题总结】【08】

71.依赖检查 依赖检查:用于检查Bean定义的属性都注入数据了,不管是自动装配的还是配置方式注入的都能检查,如果没有注入数据将报错,从而提前发现注入错误,只检查具有setter方法的属性.Spring3+也不推荐配置方式依赖检查了,建议采用Java5+ @Required注解方式.在Spring2.5中配置方式的依赖检查有none.simple.object.all四种方式. 1.none:默认方式,表示不检查: 2.objects:检查除基本类型外的依赖对象,配置方式在bean中添加属性为:

【面试】【Spring常见问题总结】【04】

31.Spring切面可以应用5 种类型的通知 l Before--在方法调用之前调用通知. l After--在方法完成之后调用通知,无论方法执行是否成功. l After-returning-- 在生方法成功执行之后调用通知. l After-throwing--在方法抛出异常后调用通知. l Around--通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为. 32.织入的时机 l 编译期--切面在目标类编译时被织入. l 类加载期--切面在目标类加载到JVM时被织入

【面试】【Spring常见问题总结】【05】

41.声明式事务管理的事务属性有5种: 传播行为:传播行为定义了客户端与彼调用方法之间的事务边界. 隔离级别:隔离级别定义了一个事务可能受其他并发事务影响的程度. 只读:表明事务是否是只读的. 事务超时:指定事务运行的最长时间,超时就回滚. 回滚规则:定义了哪些异常会导致事务回滚而哪些不会. 42.脏读.不可重复读和幻读 脏读:一个事务读取了另一个事务改写但是未提交的数据时.如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的. 不可重复读:一个事物执行相同的查询两次或者两次以上,但是每次

【面试】【Spring常见问题总结】【06】

51.spring中的applicationContext.xml能不能改为其他名字 ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化.缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置. 你可以通过定义一个<context-param>元素名字为"contextConfigLocation"来改变Spring配置文件的位置.示例如下: &l

【面试】【Spring常见问题总结】【03】

21.自动检测Bean 为了配置自动检测,需要使用<context:component-scan>元素.默认情况下,<context:component-scan>使用构造型注所标注类.这些特殊的注解如下 @Component--通用构造型注解,标识该类为Spring组件 @Controller--标识将该类定义为SpringMVC controller @Respository--标识将该类定义为数据仓库 @Service--标识将该类定义为服务 22.过滤组件扫描 通过为<

【面试】【Spring常见问题总结】【02】

11.初始化和销毁Bean 为Bean定义初始化和销毁操作,只需要使用init-method 和destroy-method参数来配置<bean>元素.init-method属性指定了在初始化Bean时要使用的方法.类似地,destroy-method属性指定了Bean从容器移除之前要调用的方法. 12.Spring集合配置元素 13.装配Map集合 <map>中的<entry>元素由一个键和一个值组成,键和值可以是简单类型,也可以是其他Bean的引用.这些属性将帮助我