第五天:
1.事务隔离级别
在之前的spirng配置中,其实有一些地方已经涉及到事务隔离级别这个东西(在Hibernate的配置也有设置这个的选项),例如在配置事务传播行为的时候,事务隔离级别是个可选项,或者在使用 @Transactional注解的时候里面有个属性叫isolation,这个也是设置事务隔离级别的,虽然大多数情况下我们使用默认的配置就可以了,但是我还是需要了解一下事务隔离级别都有哪些选择以及它们都能解决什么问题。
@Transactional注解的属性值
(1)value 类型String,可选的属性,用于指定事务管理者的名字(Transaction Manager)。
(2)propagation 类型enum:Propagation。可选的,事务传播行为。
(3)isolation 类型enum:Isolation。可选的,事务隔离级别。
(4)timeout 类型int。事务失效时间。
(5)readonly类型boolean。read/write或者read-only事务设置。
(6)rollbackeFor 类型是Throwable子类的数组(对象)。设置出发rollback异常事件。
(7)rollbackForClassname,类型是Throwable子类的数组(类名)。
(8)noRollbackFor
(9)noRollbackForClassname
事务以及事务所引发的问题
1.脏读 主要针对update操作。 一个事务A读到另一个事务B中修改过但是还没有提交的数据
2.不可重复读 主要针对update操作。 一个事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所以就出现了事务A里面读一个数据俩次,但是读到的结果是不同的。
3.幻读 主要针对的是insert/delete操作。事务A第一次用where条件筛选出了10条数据,事务A第二次用通样的where条件筛选出的却是11条数据,因为事务B在事务A的第一次和第二次查询之间进行了插入操作,并且插入的这个数据满足事务A的where筛选条件.
isolation 事务隔离级别
read-uncommitted 不提交也能读(三个问题都存在)
read-committed 提交之后才能读 解决了脏读
repeatable-read 解决了脏读和不可重复读
serializable 三个问题都解决了
级别越高解决的问题越多但是效率越低。
注意:并不是所有数据库都支持这四种事务隔离级别,比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.
oracle里面默认的事务隔离级别是第二种:read-committed
2 SSH框架集成
注意:SSH中任意一个xml中如果不提示或者不能验证标签,那么我们可以手动进行引用dtd或schame文件然后在Eclipse中进行配置
1.Eclipse创建一个web项目(Dynamic Web Project),版本选择2.5
2.把SSH集成需要用到的jar导入到项目中
3.项目中创建需要使用的package
4.在用到的package中创建需要使用的类或者接口
5.把Hibernate的映射文件(hbm)拿过来放在和实体类同package
6.把Hibernate的配置文件(cfg)拿过来放到src下面
7.把这俩个hbm文件和cfg文件的内容进行配置,和当前项目对应
8.把struts2框架的配置文件struts.xml放到src下面
9.对struts.xml文件进行配置,建议设置一下属性(都不是必须的)
<constant name="struts.action.extension" value="action"></constant>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<constant name="struts.objectFactory" value="spring"></constant>
10.把spring_dao.xml spring_service.xml spring.xml三个文件放到src下面,也可以把他们放到WEB-INF下面,只不过将来配置spring读取他们的路径配的不一样.这里先以在src下为例,之后在说明放到WEB-INF下面的情况
11.spring_dao.xml是配置dao层对象和SessionFactory的配置文件,spring_service.xml是配置service层对象以及service层事务管理的配置文件,spring.xml中使用了<import>标签把前面俩个标签引入了过来,将来spring只读去一个xml文件spring.xml就可以了。这些xml文件的名字你都可以随意起
12.spring_dao.xml和spring_service.xml文件中的内容和我们之前学习一个一个知识点时候的配置方式一模一样的,可以参考之前配置的例子来完成其中配置。
13.我们在spring的配置文件中不需要配置action对象,spring会自动管理action的,而且还是以非单例的方式管理,刚好和原本struts2的action的情况一样,在action输出this,多运行几次,对比当前action对象的内存地址变可知.
14.我们在spring中配置了service层的对象,假设该对象bean配置的名字为userService,但是我们并没有配置把这个userService注入到action中,其实即使我们不配置这个信息,在运行期间,只要action中声明的service层接口的引用的名字也叫userService,那么spring会自动的把这个service层对象注入到action中的,我们直接使用就行了
15.接下来,我们还需要有一大部分配置内容在web.xml中添加,接下来对他们进行一一介绍
编码过滤器,不需要我们亲自写了,spring给我们提供了一个
<!-- spring的中文过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts2框架的过滤器,这个是使用struts2框架必须要有的
<!-- struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
我们项目中的spring配置文件就要靠这一对配置来读取,一个负责指明xml文件的位置,一个负责读取这个位置上的xml位置(listener负责读取)
<!-- spring读取xml文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
另外如果我们的spring配置文件在WEB-INF下面,那么需要这样来配置
<!-- spring读取xml文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring_dao.xml,/WEB-INF/spring_service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
action中获得一个查询的对象,但是这个对象的查询使用了延迟加载,然后action又跳转到了页面,把该对象带到了页面,在页面中我们又想获得这个对象中的属性值,但是现在在jsp页面中没有session了已经(因为要发sql语句真正查询的),所以这时候就报错了。配置下面这个过滤器就可以解决了
<!-- 解决在jsp页面中使用Hibernate延迟加载功能的问题 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
注意:
web.xml文件中的<url-pattern>三种配置方式
1完全匹配
<url-pattern>/test/list.do</url-pattern>
2路径匹配
<url-pattern>/*</url-pattern> 匹配根路径下的全部请求
3扩展名匹配
<url-pattern>*.do</url-pattern>
<url-pattern>*.html</url-pattern> 匹配全部html结尾的请求
<url-pattern>*</url-pattern>这个是错误的配置 不能只用*,否则报错
16.其实我们也可以专门配置一个spring的xml文件,来进行对action的管理(虽然我们不去配置的话spring也会自动管理action的,原因是有对应的jar包支持)。
假如在一个叫action.xml的文件中我们这样配置:
<bean name="registAction" class="com.briup.web.action.RegistAction" scope="prototype">
<property name="service" ref="service"></property>
</bean>
那么对应的我们在struts.xml中就要这样配置:
<package name="user" extends="struts-default" namespace="/user">
<action name="regist" class="registAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
注意观察<bean>标签中的name属性值和<action>标签中的class属性值的关系
17.创建对应的jsp页面和后台action进行交互,注意参数的传递以及action、service、dao这三种对象之间的方法调用
18.测试发现数据能够成功插入数据库后,可以在service层方法中抛出异常,检查是否把事务管理的切面动态的织入到了service层的方法上了。
19.注意如果你把jar都引入到项目中,但是没有进行web.xml文件配置的时候就启动tomcat,这时候也是有可能会报错的.
1.事务隔离级别
在之前的spirng配置中,其实有一些地方已经涉及到事务隔离级别这个东西(在Hibernate的配置也有设置这个的选项),例如在配置事务传播行为的时候,事务隔离级别是个可选项,或者在使用 @Transactional注解的时候里面有个属性叫isolation,这个也是设置事务隔离级别的,虽然大多数情况下我们使用默认的配置就可以了,但是我还是需要了解一下事务隔离级别都有哪些选择以及它们都能解决什么问题。
@Transactional注解的属性值
(1)value 类型String,可选的属性,用于指定事务管理者的名字(Transaction Manager)。
(2)propagation 类型enum:Propagation。可选的,事务传播行为。
(3)isolation 类型enum:Isolation。可选的,事务隔离级别。
(4)timeout 类型int。事务失效时间。
(5)readonly类型boolean。read/write或者read-only事务设置。
(6)rollbackeFor 类型是Throwable子类的数组(对象)。设置出发rollback异常事件。
(7)rollbackForClassname,类型是Throwable子类的数组(类名)。
(8)noRollbackFor
(9)noRollbackForClassname
事务以及事务所引发的问题
1.脏读 主要针对update操作。 一个事务A读到另一个事务B中修改过但是还没有提交的数据
2.不可重复读 主要针对update操作。 一个事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所以就出现了事务A里面读一个数据俩次,但是读到的结果是不同的。
3.幻读 主要针对的是insert/delete操作。事务A第一次用where条件筛选出了10条数据,事务A第二次用通样的where条件筛选出的却是11条数据,因为事务B在事务A的第一次和第二次查询之间进行了插入操作,并且插入的这个数据满足事务A的where筛选条件.
isolation 事务隔离级别
read-uncommitted 不提交也能读(三个问题都存在)
read-committed 提交之后才能读 解决了脏读
repeatable-read 解决了脏读和不可重复读
serializable 三个问题都解决了
级别越高解决的问题越多但是效率越低。
注意:并不是所有数据库都支持这四种事务隔离级别,比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.
oracle里面默认的事务隔离级别是第二种:read-committed
2 SSH框架集成
注意:SSH中任意一个xml中如果不提示或者不能验证标签,那么我们可以手动进行引用dtd或schame文件然后在Eclipse中进行配置
1.Eclipse创建一个web项目(Dynamic Web Project),版本选择2.5
2.把SSH集成需要用到的jar导入到项目中
3.项目中创建需要使用的package
4.在用到的package中创建需要使用的类或者接口
5.把Hibernate的映射文件(hbm)拿过来放在和实体类同package
6.把Hibernate的配置文件(cfg)拿过来放到src下面
7.把这俩个hbm文件和cfg文件的内容进行配置,和当前项目对应
8.把struts2框架的配置文件struts.xml放到src下面
9.对struts.xml文件进行配置,建议设置一下属性(都不是必须的)
<constant name="struts.action.extension" value="action"></constant>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<constant name="struts.objectFactory" value="spring"></constant>
10.把spring_dao.xml spring_service.xml spring.xml三个文件放到src下面,也可以把他们放到WEB-INF下面,只不过将来配置spring读取他们的路径配的不一样.这里先以在src下为例,之后在说明放到WEB-INF下面的情况
11.spring_dao.xml是配置dao层对象和SessionFactory的配置文件,spring_service.xml是配置service层对象以及service层事务管理的配置文件,spring.xml中使用了<import>标签把前面俩个标签引入了过来,将来spring只读去一个xml文件spring.xml就可以了。这些xml文件的名字你都可以随意起
12.spring_dao.xml和spring_service.xml文件中的内容和我们之前学习一个一个知识点时候的配置方式一模一样的,可以参考之前配置的例子来完成其中配置。
13.我们在spring的配置文件中不需要配置action对象,spring会自动管理action的,而且还是以非单例的方式管理,刚好和原本struts2的action的情况一样,在action输出this,多运行几次,对比当前action对象的内存地址变可知.
14.我们在spring中配置了service层的对象,假设该对象bean配置的名字为userService,但是我们并没有配置把这个userService注入到action中,其实即使我们不配置这个信息,在运行期间,只要action中声明的service层接口的引用的名字也叫userService,那么spring会自动的把这个service层对象注入到action中的,我们直接使用就行了
15.接下来,我们还需要有一大部分配置内容在web.xml中添加,接下来对他们进行一一介绍
编码过滤器,不需要我们亲自写了,spring给我们提供了一个
<!-- spring的中文过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts2框架的过滤器,这个是使用struts2框架必须要有的
<!-- struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
我们项目中的spring配置文件就要靠这一对配置来读取,一个负责指明xml文件的位置,一个负责读取这个位置上的xml位置(listener负责读取)
<!-- spring读取xml文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
另外如果我们的spring配置文件在WEB-INF下面,那么需要这样来配置
<!-- spring读取xml文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring_dao.xml,/WEB-INF/spring_service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
action中获得一个查询的对象,但是这个对象的查询使用了延迟加载,然后action又跳转到了页面,把该对象带到了页面,在页面中我们又想获得这个对象中的属性值,但是现在在jsp页面中没有session了已经(因为要发sql语句真正查询的),所以这时候就报错了。配置下面这个过滤器就可以解决了
<!-- 解决在jsp页面中使用Hibernate延迟加载功能的问题 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
注意:
web.xml文件中的<url-pattern>三种配置方式
1完全匹配
<url-pattern>/test/list.do</url-pattern>
2路径匹配
<url-pattern>/*</url-pattern> 匹配根路径下的全部请求
3扩展名匹配
<url-pattern>*.do</url-pattern>
<url-pattern>*.html</url-pattern> 匹配全部html结尾的请求
<url-pattern>*</url-pattern>这个是错误的配置 不能只用*,否则报错
16.其实我们也可以专门配置一个spring的xml文件,来进行对action的管理(虽然我们不去配置的话spring也会自动管理action的,原因是有对应的jar包支持)。
假如在一个叫action.xml的文件中我们这样配置:
<bean name="registAction" class="com.briup.web.action.RegistAction" scope="prototype">
<property name="service" ref="service"></property>
</bean>
那么对应的我们在struts.xml中就要这样配置:
<package name="user" extends="struts-default" namespace="/user">
<action name="regist" class="registAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
注意观察<bean>标签中的name属性值和<action>标签中的class属性值的关系
17.创建对应的jsp页面和后台action进行交互,注意参数的传递以及action、service、dao这三种对象之间的方法调用
18.测试发现数据能够成功插入数据库后,可以在service层方法中抛出异常,检查是否把事务管理的切面动态的织入到了service层的方法上了。
19.注意如果你把jar都引入到项目中,但是没有进行web.xml文件配置的时候就启动tomcat,这时候也是有可能会报错的.