第四章 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”