Spring学习笔记二

第四章 Spring与数据库

一、 DataSource

Spring提供了在Spring上下文配置数据源bean的多种方式包括

通过JDBC驱动程序定义的数据源

通过JNDI查找的数据源

连接池的数据源

1. 使用数据源连接池

DBCPdatabase 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种数据源对象。

DriverManagerDataSource 在每个连接请求时都会返回一个新建的连接。与DBCPBasicDataSource不同。DriverManagerDataSource提供的连接并没有进行池化管理

SingleConnectionDataSource 在每个连接请求时都会返回同一个连接

以上两个数据源配置类似于BasicDataSource:

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSourcedestroy-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. 声明hibernateSession工厂

配置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"/>

二、 事务属性

一、 传播行为

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


 

二、 隔离级别

隔离级别定义了一个事务可能接受其他并发事务影响的程度。多事务并发运行可能会导致以下问题 :

脏读:脏读发生在一个事务读取了另一个事务的改写但尚未提交的数据时。如果改写的数据被回滚了,那么第一个事务获取的数据就是无效的。

不可重复读:不可重复读发生在一个事务执行相同的查询两次及以上,但是每次得到的数据不同时。这通常是因为另一个并发事务在两次查询期间更新了数据。

幻读:它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录。

在理想情况下,事务之间应该是完全隔离的,但是这样会导致性能问题。

三、 只读

如果事务只是对后端的数据库进行读操作,数据库可以利用只读特性来进行一些特定的优化。因为只读优化是在事务启动的时候由数据库实施的,只对那些具备启动一个新的事务的传播行为有意义。设定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 beanscope设置为prototype



你可能感兴趣的:(spring,spring配置,Spring教程)