您的位置:首页 > 编程语言 > Java开发

Spring学习笔记二

2015-08-16 13:02 423 查看

第四章 Spring与数据库

一、 DataSource

Spring提供了在Spring上下文配置数据源bean的多种方式包括l 通过JDBC驱动程序定义的数据源l 通过JNDI查找的数据源l 连接池的数据源

1. 使用数据源连接池

DBCP(database conection pool)是一个不错的连接池选择。其中的BasicDataSource的最常用的,因为它在Spring中易于配置。在Spring中可以使用以下代码来配置dbcp。<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"p:driverClassName="org.postgresql.Driver"p:url="jdbc:postgresql://127.0.0.1:5432/test"p:username="postgres"p:password="Hik12345"/>这几个属性是必须的。除此之外还有多个属性来陪住数据源连接池。
配置属性所指定的内容
initializeSize连接池启动时创建的连接数量
maxActive同一时间可从池中分配的最多连接数,0表示无限制
maxIdle池里不会被释放的最多空闲连接数,0表示无限制
maxOpenPreparedStatements同一时间能够从池中分配的预处理语句的最大数量,0表示无限制
maxWait抛出异常之前,池等待连接回收的最大时间(当没有可用连接时),-1表示无限等待
minEvicatableIdleTimeMillis连接在池中保持空闲而不被回收的最大时间
minIdle在不创建新的连接情况下,池中保持空闲的最小连接数
poolPreparedStatements是否对预处理语句进行池管理 (布尔值)

2. 基于JDBC驱动的数据源

在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供2种数据源对象。n DriverManagerDataSource 在每个连接请求时都会返回一个新建的连接。与DBCP的BasicDataSource不同。DriverManagerDataSource提供的连接并没有进行池化管理n SingleConnectionDataSource 在每个连接请求时都会返回同一个连接以上两个数据源配置类似于BasicDataSource:<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"p:driverClassName="org.postgresql.Driver"p:url="jdbc:postgresql://127.0.0.1:5432/test"p:username="postgres"p:password="Hik12345"/>

二、 在spring中集成hibernate

1. 声明hibernate的Session工厂

配置LocalSessionFactoryBean<bean id="sessionfactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="datasource"/><property name="hibernateProperties"><props><prop key="hibernate.Dialect">org.hibernate.dialect.PostgreSQLDialect</prop><prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.autocommit">false</prop></props></property><property name="mappingResources"> <list> <value>hbn.xml</value> </list> </property></bean>
其中,hibernateProperties是指hibernate的一些相关配置,mappingResources是指通过xml配置方式配置的实体类。还有一种AnnotationSessionFactoryBean,可以使用注解配置的实体类。配置如下 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"><props><prop key="hibernate.Dialect">org.hibernate.dialect.PostgreSQLDialect</prop><prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.autocommit">false</prop></props></property><property name="packagesToScan"> <list> <value>com.demo.springmvn</value> </list> </property> <property name="annotatedClasses"> <list> <value>com.demo.springmvn.User</value> </list> </property </bean>其中,packagesToScan是指自动扫描的包,可以自动识别包中的使用注解的实体,不需要使用xml配置。annotatedClasses是指单个使用注解的实体类

第五章 事务管理

一、 事务管理器

1. JDBC事务管理器

如果在程序中使用JDBC进行持久化,可以使用JDBC事务管理器DataSourceTransactionManager。需要使用如下xml将其装配到应用程序上下文中。<bean id="transactionManager" class="org.springframework.jdbc.datasource.DatasourceTransactionManager" p:dataSource-ref="dataSource"/>在幕后DataSourceTranscationManager通过调用java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务。同样,事务失败时通过调用rollback()来回滚。

2. Hiberna事务

如果应用程序的持久化是通过Hibernate实现的,需要使用HibernateTransactionManager。对于Hibernate3,需要在Spring上下文定义中添加如下的bean声明:<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory0"/>

二、 事务属性

一、 传播行为

传播行为定义了客户端与被调用方法之间的事务边界。

二、 隔离级别

隔离级别定义了一个事务可能接受其他并发事务影响的程度。多事务并发运行可能会导致以下问题 :n 脏读:脏读发生在一个事务读取了另一个事务的改写但尚未提交的数据时。如果改写的数据被回滚了,那么第一个事务获取的数据就是无效的。n 不可重复读:不可重复读发生在一个事务执行相同的查询两次及以上,但是每次得到的数据不同时。这通常是因为另一个并发事务在两次查询期间更新了数据。n 幻读:它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录。在理想情况下,事务之间应该是完全隔离的,但是这样会导致性能问题。

三、 只读

如果事务只是对后端的数据库进行读操作,数据库可以利用只读特性来进行一些特定的优化。因为只读优化是在事务启动的时候由数据库实施的,只对那些具备启动一个新的事务的传播行为有意义。设定readOnly=”true”即可。

四、 事务超时

为了使应用程序很好地运行,事务不能运行太长时间。因此,声明式事务下一个特性就是超时(timeout)。

五、 回滚规则

默认情况下,事务只有在遇到运行期异常才会回滚,遇到检查型异常时不会回滚。

三、 在XML中定义事务

首先声明事务管理器:<bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"></bean>
定义一个advice
<tx:advice id="txAdvice" transaction-manager="tm"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice>
在advice中注入事务管理器,定义tx 属性。
定义AOP 及切点
<aop:config><aop:pointcut expression="execution(* com.demo.springmvn.UserService.*(..))" id="pointcut"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/></aop:config>
定义切点为事务边界,并用advice通知。

四、 定义注解驱动的事务

在配置文件中配置事务管理器的bean<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>在配置文件中定义元素<tx:annotation-driven transaction-manager="tm"/>,开启事务管理注解,并指定事务管理器。在需要事务管理的方法上面使用@Transactional注解即可。

第六章 Spring 与Struts2整合

在web.xml文件中配置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>/*</url-pattern> </filter-mapping>配置spring容器,配置为监听器,在web 容器启动时启动。<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>配置Spring配置文件加载位置。如果不配置的话默认位置为/WEB-INF/action-servlet.xml,/WEB-INF/applicationContext.xml<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-cfg.xml</param-value></context-param>。spring 与 struts2 配置基本完毕,注意在struts2的配置文件中,如果action 已经被声明为bean了,则action 的class设置为action bean的名字,不要使用action的类名。且action bean的scope设置为”prototype”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: