常用数据源:DBCP、C3P0、BoneCP、Druid等…
XAConnection 对象可以直接生产数据库物理连接,同时生产 XAResource 用于支持XA事务,通常 XAConnection 对象生产出的数据库物理连接 Connection 需要和该 XAConnection 生产出的 XAResource 对象配合使用以完成XA事务处理。 并且XAConnection 继承 PooledConnection,那就也具备连接池的实现。
2.1 XA数据源是什么 XA数据源指的是支持XA规范的数据源,支持分布式事务。
2.2 XA规范是什么 XA规范是一种分布式事务解决方案。X/OPEN组织定义的分布式事务处理模型(DTP),其包含3种角色和两个协议:
角色:
协议:
该模型中应用程序将一个全局事务传送到事务管理器,事务管理器将每个全局事务分解为多个分支(分支事务),并将分支事务分配给单独的资源管理器进行服务,事务管理器通过XA接口将每个分支事务与适当的资源管理器进行协调。
2.3 分布式事务具备有什么样的作用? 如果仅在同一个事务上下文中需要协调多种资源(即数据库以及消息主题或队列等等),这个事务中的所有操作都必须成功,否则所有操作都将在失败的情况下回滚。 这就是XA数据源的作用。
2.4 那什么样的场景需要使用XA?
3.1 J2EE的分布式事务 Java事务编程接口(Java Transaction API,JTA)和Java事务服务(Java Transaction Service,JTS)为J2EE平台提供了分布式事务服务。
JTA事务是XA规范的Java实现,JTA事务有效的屏蔽了底层事务资源,使应用可以以透明的方式参与到事务处理中。分布式事务包括事务管理器和一个或多个支持XA协议的资源管理器。
JTA是面向应用或应用服务器与资源管理器的高层事务接口。
JTS是一组约定JTA中角色之间交互细节的规范。
JTA提供了以下四个接口
开发者调用UserTransaction.begin方法时,因为UserTransaction的实现类持有TransactionManager,TransactionManager充当UserTransaction和Transaction之间的桥梁,
所以在调用UserTransaction的begin方法时,TransactionManager会创建Transaction事务对象,并把此对象通过ThreadLocal关联到当前线程。
当调用UserTransaction其他方法时,会从当前线程取出事务对象Transaction对象,并通过Transaction对象找到与其关联的XAResource对象,然后进行commit、rollback等操作。其基本流程如以下代码:
// 创建一个Transaction,挂到当前线程上
UserTransaction userTx = null;
Connection connA = null;
Connection connB = null;
try{
userTx.begin();
// 将Connection对应的XAResource挂到当前线程对应的Transaction
connA.exec("xxx")
connB.exec("xxx")
// 找到Transaction关联的XAResource,让它们都提交
userTx.commit();
}catch(){
// 找到Transaction关联的XAResource,让它们都回滚
userTx.rollback();
}
3.2 如何使用J2EE的分布式事务 WebLogic、Websphere、JBoss等主流的应用服务器提供了JTA的实现和支持。 Tomcat中没有提供JTA的实现的,这就需要借助第三方的框架Jotm、Automikos等来实现。
数据源的开发步骤:
抽取配置文件: 目的: 让具体的字符串设置与数据源解耦合
Spring配置数据源: 可以将DataSource的创建权交给Spring容器去完成
抽取jdbc配置文件: applicationContext.xml加载jdbc.properties配置文件获得连接信息。
首先需要引入context命名空间和约束路径:
命名空间:
xmlns:context="http://www.springframework.org/schema/context"
约束路径 :
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!-- Spring产生数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${key}"></property>
<property name="jdbcUrl" value="${key}"></property>
<property name="user" value="${key}"></property>
<property name="password" value="${key}"></property>
</bean>
Spring容器加载properties文件
<context:property-placeholder location="xx.properties"></context:property-placeholder>
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发
Spring原始注解主要替代 的配置
组件扫描:
在注解开发中,可以不用使用set方式就可以进行依赖注入喔~!
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法时Bean的销毁方法 |
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定Spring在初始化容器时要扫描的包,作用和在Spring的xml配置文件中下列语句一样:<context:component-scan base-package=“.”/> |
@Bean | 使用在方法上,标注该方法的返回值存储到Spring容器中 |
@PropertySource | 用于加载.properties文件中的配置 |
@Import | 用于导入其他配置类 |
@RequestMapping | 用于方法的映射请求 |
在测试类中,每个测试方法都有一下两行代码:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountService" 或者 IAccountService.class);
配置文件
方式获取的,但是每次从容器中获得Bean时都要编写配置文件
,这样的弊端是指配置文件加载多次,应用上下文对象创建多次。