三种事务的创建由对应的JDBCTransactionFactory,JTATransactionFactroy,CMTTransactionFactory完成
这三者区别在
connectionReleaseMode
JTATransactionFactroy和CMTTransactionFactory连接释放模式执行每条语句后释放连接,JDBCTransactionFactory事务提交后释放,因此jta事务连接的重用高
TransactionManager
JDBCTransactionFactory和JTATransactionFactroy不需要TransactionManager,CMTTransactionFactory必须
isTransactionInProgress
JDBCTransactionFactory确定执行JDBCTransaction begin方法,但没提交或回滚过视为正在进行
JTATransactionFactroy
通过缓存的JTATransaction.getUserTransaction状态确定
如果找不到,通过transactionManager状态确定
如果找不到,通过JNDI查找userTransaction状态确定
CMTTransactionFactory
通过transactionManager.getTransaction状态确定
factory通过org.hibernate.transaction.TransactionFactoryFactory.buildTransactionFactory确定,简单表述下
通过hibernate.transaction.factory_class确定,如果为空,返回JDBCTransactionFactory
否则实例化hibernate.transaction.factory_class指定类,并调用configure方法
package org.hibernate.transaction;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Environment;
import org.hibernate.util.ReflectHelper;
/**
* @author Gavin King
*/
public final class TransactionFactoryFactory {
private static final Log log = LogFactory.getLog(TransactionFactoryFactory.class);
/**
* Obtain a TransactionFactory with the transaction handling strategy
* specified by the given Properties.
*
* @param transactionProps transaction properties
* @return TransactionFactory
* @throws HibernateException
*/
public static TransactionFactory buildTransactionFactory(Properties transactionProps) throws HibernateException {
String strategyClassName = transactionProps.getProperty(Environment.TRANSACTION_STRATEGY);
if (strategyClassName==null) {
log.info("Using default transaction strategy (direct JDBC transactions)");
return new JDBCTransactionFactory();
}
log.info("Transaction strategy: " + strategyClassName);
TransactionFactory factory;
try {
factory = (TransactionFactory) ReflectHelper.classForName(strategyClassName).newInstance();
}
catch (ClassNotFoundException e) {
log.error("TransactionFactory class not found", e);
throw new HibernateException("TransactionFactory class not found: " + strategyClassName);
}
catch (IllegalAccessException e) {
log.error("Failed to instantiate TransactionFactory", e);
throw new HibernateException("Failed to instantiate TransactionFactory: " + e);
}
catch (java.lang.InstantiationException e) {
log.error("Failed to instantiate TransactionFactory", e);
throw new HibernateException("Failed to instantiate TransactionFactory: " + e);
}
factory.configure(transactionProps);
return factory;
}
private TransactionFactoryFactory() {}
}
分享到:
相关推荐
例如,我们可以定义一个`TransactionFactory`接口,以及针对MySQL、Oracle等数据库的实现类: ```java public interface TransactionFactory { Transaction createTransaction(Connection conn); } public class ...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new ...
首先, Hibernate 框架的主要组件包括 SessionFactory、Session、Persistant、Transaction、ConnectionProvider 和 TransactionFactory 等。其中,SessionFactory 是 JavaBean 对象与数据库表之间关系在内存中的镜像...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new ...
private final TransactionFactory transactionFactory; private final DataSource dataSource; } ``` 二、事务抽象 MyBatis把事务管理抽象出Transaction接口,由TransactionFactory接口的实现类负责创建。...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration config = new Configuration...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); ``` 这种方式提供了更多的编程灵活性,...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); DataSource dataSource = new PooledDataSource(driver, url, username, password); Environment environment = new Environment(id, ...
- **TransactionFactory**:TransactionFactory负责创建Transaction对象。同样地,开发者通常不会直接使用它,而是可以通过扩展来自定义事务的创建过程。 #### 三、深入理解Hibernate的体系结构 - **SessionFactory...
小傅哥博客中提供的示例代码是 Mybatis 框架中的原型模式应用,包括 Executor 和 TransactionFactory 两个类的实现。 四、建造者模式 建造者模式是一种创建型模式,提供了一种创建对象的接口,使得客户端可以根据...
- **TransactionFactory**: 生成 Transaction 对象的工厂,通过 TransactionFactory 实现了事务的封装,使其具体的实现方法与应用程序无关。 - **Configuration 接口**: 用于配置 Hibernate,并启动 Hibernate,...
创建SqlSession DefaultSqlSessionFactory(类):实现SqlSessionFactory,交替sqlSession工厂类创建SqlSession,TransactionFactory,关闭事务等可自定义ExecutorType(执行器类型)/事务隔离界别/是否自动提交等...
TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new ...
- 创建`TransactionFactory`:根据`Configuration`中指定的事务管理器类型创建相应的`TransactionFactory`。 - 创建`Executor`:根据`Configuration`中指定的执行器类型创建相应的`Executor`。 - 创建`...
`TransactionFactory` 用于根据配置创建事务实例。 配置 `SessionFactory` 可以通过编程方式完成,如使用 `NHibernate.Cfg.Configuration` 类,加载 XML 映射文件并设置各种参数,如 SQL 方言、外连接抓取、缓存...
5. TransactionFactory:生成Transaction对象的工厂,用于扩展。 为了开始一个简单的Hibernate应用程序,你需要: 1. 设置对象(VO),遵循ORMapping规则,包括标识属性。 2. 创建数据库表与对象对应的结构。 3. ...
7. **TransactionFactory (net.sf.hibernate.TransactionFactory)** - **定义**:事务实例的工厂,同样对应用程序不可见,但可以被开发者扩展或实现。 #### 第2章 ISessionFactory配置 **可编程配置方式** ...
7. **TransactionFactory**:事务实例的工厂,可由开发者扩展。 ### NHibernate配置 配置NHibernate涉及设定数据库方言、外连接抓取、缓存策略、查询语言替换和日志记录等。配置可以通过XML文件或编程方式进行: ...
它继承自AbstractSqlSessionFactoryBean,并重写了configure方法,根据Spring的配置来设置DataSource、TransactionFactory、Environment等属性。 2. MyBatisNamespaceParser:它是MyBatis-Spring中的一个XML解析器...