论坛首页 Java企业应用论坛

用DataSourceTransactionManager但不用JDBCTemplate

浏览 22000 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-18  
我想最好不用DataSourceUtils, 看javadoc里面是

自己需要对DataSource进行包装一下,包装为TransactionAwareDataSourceProxy


我其实是想看看谁这么用过,探讨一下.... 细节还是需要仔细研究的
 
毕竟用jdbcTemplate,还是比较麻烦的,而且直接面向sql的,不如我自己封装的好用.

我自己先做一些试验吧,估计这么用的人没有几个吧 
0 请登录后投票
   发表时间:2005-03-18  
不用JdbcTemplate很正常,DataSourceUtils只是个util类帮你把得到Connection加入到tx中,又不麻烦。
你要自己实现TransactionAwareDataSourceProxy的话还是要看看DataSourceUtils的源代码,看看如何将connection加入到tx中。
0 请登录后投票
   发表时间:2005-03-18  
不需要实现吧,看javadoc的说明
只需要把原来的DataSource包装后当作原来的DataSource使用就可以了吧
0 请登录后投票
   发表时间:2005-03-18  
我的意思就说你要自己动手包装,bind connection到current thread, 加入事务,还是挺麻烦的。用DataSourceUtils就会方便很多。

package rst.spring.datasourceutils;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.datasource.DataSourceUtils;

/**
 * Class description.
 *
 * @author rst
 */
public class TransactionAwareDataSourceProxy implements DataSource {
    
    private DataSource datasource;

    /* (non-Javadoc);
     * @see javax.sql.DataSource#getLoginTimeout();
     */
    public int getLoginTimeout(); throws SQLException {
        return datasource.getLoginTimeout();;
    }

    /* (non-Javadoc);
     * @see javax.sql.DataSource#setLoginTimeout(int);
     */
    public void setLoginTimeout(int arg0); throws SQLException {
        datasource.setLoginTimeout(arg0);;
    }

    /* (non-Javadoc);
     * @see javax.sql.DataSource#getLogWriter();
     */
    public PrintWriter getLogWriter(); throws SQLException {
        return datasource.getLogWriter();;
    }

    /* (non-Javadoc);
     * @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter);
     */
    public void setLogWriter(PrintWriter arg0); throws SQLException {
        datasource.setLogWriter(arg0);;
    }

    /* (non-Javadoc);
     * @see javax.sql.DataSource#getConnection();
     */
    public Connection getConnection(); throws SQLException {
        return DataSourceUtils.getConnection(datasource);;
    }

    /* (non-Javadoc);
     * @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String);
     */
    public Connection getConnection(String arg0, String arg1); throws SQLException {
        return DataSourceUtils.getConnection(datasource);;
    }

    /**
     * @return Returns the datasource.
     */
    public DataSource getDatasource(); {
        return datasource;
    }
    /**
     * @param datasource The datasource to set.
     */
    public void setDatasource(DataSource datasource); {
        this.datasource = datasource;
    }
}



你只要:
datasourceProxy = new TransactionAwareDataSourceProxy();
datasourceProxy.setDatasource(m_datasource);
dao.setDatasource(datasourceProxy);
0 请登录后投票
   发表时间:2005-03-18  
???

spring自己本身就带一个TransactionAwareDataSourceProxy 啊....
0 请登录后投票
   发表时间:2005-03-18  
汗。。。
是哦是哦,没仔细看。

还要对connection的close方法进行处理,这倒没有想到。
0 请登录后投票
   发表时间:2005-03-22  
TransactionProxyFactoryBean 必须是单态吗...很烦啊
0 请登录后投票
   发表时间:2005-03-22  
看看这个方法的java doc,显然是可以prototype的。

setTarget()
The target may be any object, in which case a SingletonTargetSource will be created. If it is a TargetSource, no wrapper TargetSource is created: This enables the use of a pooling or prototype TargetSource etc.
0 请登录后投票
   发表时间:2005-03-22  
哦...看到了...好像是可以,在spring的test里面有几个测试用的

不过正式的例子里面好像没人这么用过哦....

而且看getObject里面是直接返回"this.proxy"

还是不太明白啊

回去试试再说吧...


:(
0 请登录后投票
   发表时间:2005-03-23  
使用PrototypeTargetSource试了一下,装载applicationContext.xml的时候就报错

计划改自己的类,实现线程安全...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics