Spring学习笔记二

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

时间: 2024-11-05 06:31:33

Spring学习笔记二的相关文章

Spring学习笔记二(Bean注入的几种方式)

1.前言 上一篇博客从宏观上讲解了一下Spring的知识,下面这篇来着重讲解一下有关Bean注入的几种方式. 2.Bean注入的几种方式 2.1 类构造器初始化 这也是默认的方式,在上一篇博客中也有所体现.直接在applicationContext.xml配置文件中,配置Bean标签即可 <span style="font-family:SimSun;font-size:18px;"><!-- 实例工厂初始化 --> <!-- 必须先创建实例工厂对应的Be

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

Spring学习笔记(三)

Spring学习笔记(三) AOP 一.使用Annotation方式实现AOP.步骤: xml里加入配置:<aop:aspectj-autoproxy /> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

Cookie学习笔记二:Cookie实例

今天说说刚刚学到的两个Cookie的最经典应用:自动登录和购物车设置 一:自动登录 需要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp处理登录信息:如果有Cookie,则自动登录,否则创建输入信息的对象的Cookie,下次登录可以直接登录,但是我们在这里给Cookie设置一个最大保存时间30s,即登录30s后会自动退回到登陆页面,具体代码如下: login.jsp: <%@ page language="java" con

spring学习笔记(一) Spring概述

博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring的优势在哪里?怎么系统的学习Spring? 一.什么是Spring? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发. 那有人就会问了,Spring是如何简化开发的? 在传统开发中,一个应用是需

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚