[讨论]在业务中使用发布/订阅模式,如何处理和事务之间的关系? 事务spring设计模式 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在公司的项目里是这样解决这个问题的,我们也用到了Spring的声明式事务,因为是AOP的方式所以只有在方法执行完成后才会去commit或者rollback,这里需要在如果rollback后完成一些善后动作.我们的做法是这样.public class OnCallDataSource implements DataSource { private DataSource dataSource; public OnCallDataSource(DataSource dataSource) { this.dataSource = dataSource; DataSourceUtil.OnCallHouse.allowCall(); } public Connection getConnection() throws SQLException { return new OnCallConnection(dataSource.getConnection()); } //其他方法都是直接委托给原来的DataSource.}对.就是返回一个我们自己的Connection实现,这个实现包装了原有的正常Connection.public class OnCallConnection implements Connection { private Connection conn; public OnCallConnection(Connection conn) throws SQLException { this.conn = conn; this.conn.setAutoCommit(false); } public void commit() throws SQLException { this.conn.commit(); executeCalls( DataSourceUtil.OnCallHouse.getCalls( DataSourceUtil.OnCallHouse.COMMIT_CALLS)); } public void rollback() throws SQLException { this.conn.rollback(); executeCalls( DataSourceUtil.OnCallHouse.getCalls( DataSourceUtil.OnCallHouse.ROLLBACK_CALLS)); } public void rollback(Savepoint savepoint) throws SQLException { this.conn.rollback(savepoint); executeCalls(DataSourceUtil.OnCallHouse.getCalls( DataSourceUtil.OnCallHouse.ROLLBACK_CALLS)); } private void executeCalls(List<Runnable> calls) { if (calls.isEmpty()) { return; } Runnable call = null; int size = calls.size(); for (int i = 0; i < size; i++) { call = calls.get(i); try { call.run(); } catch (Exception ex) { LOG.errorLog(ex); } } DataSourceUtil.OnCallHouse.clear(); }//同OnCallDataSource}最后是那个临时储存回调方法的地方OnCallHouse其实就是利用ThreadLocal来储存回调任务列表的. 文件上传问题 为啥我访问一个action 会跳转到另一个action里面 关于httpclient读取网站flash的问题 struts新手提问?? jsp中省市区级联问题 lucene只能检索到英文 怎么才能检索中文 请教一个有关java配置的问题 在jb9里添加xerces2.6.2的引用,org.apache.xerces.parsers.DOMParser就没有了? java的接口问题!!! 冒昧问一句,OpenTools和EJB有什么关系,EJB有那么重要吗,我用JBuilder里的大部分控件就可以搞定大部分程序了? java新人求助大神。 mybatis分页(菜鸟求教)
public class OnCallDataSource implements DataSource {
private DataSource dataSource; public OnCallDataSource(DataSource dataSource) {
this.dataSource = dataSource;
DataSourceUtil.OnCallHouse.allowCall();
} public Connection getConnection() throws SQLException {
return new OnCallConnection(dataSource.getConnection());
} //其他方法都是直接委托给原来的DataSource.
}
对.就是返回一个我们自己的Connection实现,这个实现包装了原有的正常Connection.
public class OnCallConnection implements Connection { private Connection conn; public OnCallConnection(Connection conn) throws SQLException {
this.conn = conn;
this.conn.setAutoCommit(false);
} public void commit() throws SQLException {
this.conn.commit();
executeCalls(
DataSourceUtil.OnCallHouse.getCalls(
DataSourceUtil.OnCallHouse.COMMIT_CALLS));
} public void rollback() throws SQLException {
this.conn.rollback();
executeCalls(
DataSourceUtil.OnCallHouse.getCalls(
DataSourceUtil.OnCallHouse.ROLLBACK_CALLS));
} public void rollback(Savepoint savepoint) throws SQLException {
this.conn.rollback(savepoint);
executeCalls(DataSourceUtil.OnCallHouse.getCalls(
DataSourceUtil.OnCallHouse.ROLLBACK_CALLS));
} private void executeCalls(List<Runnable> calls) {
if (calls.isEmpty()) {
return;
} Runnable call = null;
int size = calls.size();
for (int i = 0; i < size; i++) {
call = calls.get(i);
try {
call.run();
} catch (Exception ex) {
LOG.errorLog(ex);
}
}
DataSourceUtil.OnCallHouse.clear();
}//同OnCallDataSource
}
最后是那个临时储存回调方法的地方OnCallHouse其实就是利用ThreadLocal来储存回调任务列表的.