jiveJdon4.1 中关于事务的的疑惑

10-12-23 freesea1
在com.jdon.jivejdon.service.util中有定义了一个JtaTransactionUtil 事务工具类

	private TransactionManager transactionManager;

	public JtaTransactionUtil(String[] txpram) {
		if (txpram[0].equals(JTA)) {
			try {
				transactionManager = (TransactionManager) new InitialContext().lookup(txpram[1]);
			} catch (NamingException e) {
				e.printStackTrace();
			}
		}
	}
<p>

在com.jdon.jivejdon.service.services.xml有一段定义如下:

 <!-- Tansaction JNDI   -->
        <component name="jtaTransactionUtil"
			class="com.jdon.jivejdon.service.util.JtaTransactionUtil">
			 <!--<constructor value="JTA"/>  
			    <constructor value="java:/TransactionManager"/> -->
			  <constructor value="JDBC"/>
<p>

这里不是使用JDBC吗,如果是的话,那上面JtaTransactionUtil类怎么能够取得transactionManager实例对象呢,如果取不到,那么JtaTransactionUtil的共它方法怎么能用呀

比如:下面的方法怎么能使用呢

	public void beginTransaction() throws Exception {
		if (!checkIsJTA())
			return;
		transactionManager.begin();
	}

	public void commitTransaction() throws Exception {
		if (!checkIsJTA())
			return;
		transactionManager.commit();
	}

	public void rollback() {
		if (transactionManager != null) {
			try {
				transactionManager.rollback();
			} catch (Exception ex) {
			}
		}
	}
<p>

真是想不通呢,如果上面的配置配成

<!-- Tansaction JNDI -->

<component name="jtaTransactionUtil"

class="com.jdon.jivejdon.service.util.JtaTransactionUtil">

<constructor value="JTA"/>

<constructor value="java:/TransactionManager"/>

<!--<constructor value="JDBC"/>-->

这样才对吧,但是论坛像上面的都可以成功,所以想不明白

    

oojdon
2010-12-23 17:52
if (!checkIsJTA())

return;

如果不是JTA就直接返回了,用自动提交事务

freesea1
2010-12-23 18:00
补充一下,我是在看增加论坛信息过程时,感觉上面看不太明白,不过也收获挺多的,希望道友可以指点一下

我是直接从服务层开如看的

ForumMessageShell.java中的

public void createTopicMessage(EventModel em) throws Exception {
...

if (!UtilValidate.isEmpty(forumMessage.getMessageVO().getBody())){				messageKernel.addTopicMessage(em);
}
}
<p>

addTopicMessage再调用MessageTransactionPersistence的

	public void insertTopicMessage(EventModel em) throws Exception {
		logger.debug("enter createTopicMessage");
		ForumMessage forumMessage = (ForumMessage) em.getModelIF();
		try {
			jtaTransactionUtil.beginTransaction();
			messageRepository.createTopicMessage(forumMessage);
			logger.debug("createTopicMessage ok!");
			jtaTransactionUtil.commitTransaction();
		} catch (Exception e) {
			jtaTransactionUtil.rollback();
			String error = e + " createTopicMessage forumMessageId=" + forumMessage.getMessageId();
			logger.error(error);
			throw new Exception(error);
		}
	}
<p>

这里开始提交创建论坛发贴的事务,所以我想研究一下jtaTransactionUtil里的JTA是怎么使用的,看了下配置,就产生了主题贴的疑问。

因为我想用这种方式处理我刚开始的一个小系统,因为有多个数据库,所以需要JTA的支持。

感觉收获也是挺多的,论坛的分层很清淅(一开始看挺混乱的,转来转去,慢慢领悟到了,呵)

freesea1
2010-12-23 18:17
多谢oojdon,这样一说我才明白了些。

在没搞明白之前的时候,我自己模仿了一个JDBC的事务,不知道有没有这个必要呢。因为我是小系统,不想像论坛一样,好多类跳来转去,最终由仓储的dao来持久。

	public class JDBCTransactionUtil {
	private static final Logger logger = LoggerFactory.getLogger(JDBCTransactionUtil.class);
	
	private JdbcTempSource jdbcTempSource;
	private Connection con;

	public JDBCTransactionUtil(String jndi) throws Exception {
		this.jdbcTempSource = new JdbcTempSource(jndi);
		try {
			this.con = jdbcTempSource.getDataSource().getConnection();
		} catch (SQLException e) {
			logger.error("[JDBCTransactionUtil]获取getConnection出错:{}",e);
			throw new Exception(e);
		}
	}

	/**
	 * 开始JDBC事务
	 * */
	public void beginTransaction() throws SQLException {
		con.setAutoCommit(false);
	}

	/**
	 * 提交事务
	 * 
	 * @throws SQLException
	 * */
	public void commitTransaction() throws SQLException {
		con.commit();
	}

	/**
	 * 回滚事务
	 * 
	 * @throws SQLException
	 * */
	public void rollback() throws SQLException {
		con.rollback();
	}

	/**
	 * 返回是否自动提交标志
	 * 
	 * @return boolean
	 * @throws SQLException
	 */
	public boolean isAutoCommit() throws SQLException {
		return con.getAutoCommit();
	}

	public JdbcTempSource getJdbcTempSource() {
		return jdbcTempSource;
	}

	public void setJdbcTempSource(JdbcTempSource jdbcTempSource) {
		this.jdbcTempSource = jdbcTempSource;
	}

}
<p>

freesea1
2010-12-23 18:18
多谢oojdon,这样一说我才明白了些。

在没搞明白之前的时候,我自己模仿了一个JDBC的事务,不知道有没有这个必要呢。因为我是小系统,不想像论坛一样,好多类跳来转去,最终由仓储的dao来持久。

	public class JDBCTransactionUtil {
	private static final Logger logger = LoggerFactory.getLogger(JDBCTransactionUtil.class);
	
	private JdbcTempSource jdbcTempSource;
	private Connection con;

	public JDBCTransactionUtil(String jndi) throws Exception {
		this.jdbcTempSource = new JdbcTempSource(jndi);
		try {
			this.con = jdbcTempSource.getDataSource().getConnection();
		} catch (SQLException e) {
			logger.error("[JDBCTransactionUtil]获取getConnection出错:{}",e);
			throw new Exception(e);
		}
	}

	/**
	 * 开始JDBC事务
	 * */
	public void beginTransaction() throws SQLException {
		con.setAutoCommit(false);
	}

	/**
	 * 提交事务
	 * 
	 * @throws SQLException
	 * */
	public void commitTransaction() throws SQLException {
		con.commit();
	}

	/**
	 * 回滚事务
	 * 
	 * @throws SQLException
	 * */
	public void rollback() throws SQLException {
		con.rollback();
	}

	/**
	 * 返回是否自动提交标志
	 * 
	 * @return boolean
	 * @throws SQLException
	 */
	public boolean isAutoCommit() throws SQLException {
		return con.getAutoCommit();
	}

	public JdbcTempSource getJdbcTempSource() {
		return jdbcTempSource;
	}

	public void setJdbcTempSource(JdbcTempSource jdbcTempSource) {
		this.jdbcTempSource = jdbcTempSource;
	}

}
<p>

猜你喜欢
2Go 1 2 下一页