使用spring 管理原生jdbc的事務

項目裡面用的是jdbc 操作類 然後自己封裝了一些操作增刪改查 包括數據庫和類的映射

有問題的是怎麼去做 用spring 管理jdbc的事務 (或者自己書寫!)

1創建 jdbc操作類 IcyDataTemplate  

public class IcyDataTemplate implements DataSource {

    DataSource    dataSource;

    public PrintWriter getLogWriter() throws SQLException {
        return dataSource.getLogWriter();
    }

    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    public void setLoginTimeout(int seconds) throws SQLException {
    }

    public int getLoginTimeout() throws SQLException {
        return dataSource.getLoginTimeout();
    }

    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return dataSource.getParentLogger();
    }

    public <T> T unwrap(Class<T> iface) throws SQLException {
        return dataSource.unwrap(iface);
    }

    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return dataSource.isWrapperFor(iface);
    }

    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public Connection getConnection(String username, String password) throws SQLException {
        return dataSource.getConnection(username, password);
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }


2創建IcyDataTemplateFactory  數據源管理類
 
	 
import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import customerEnter.Frame.JDBCDao.JdbcTemplate.IcyDataTemplate;


public class IcyDataTemplateFactory {

    IcyDataTemplate    icyDataTemplate;

    public Connection getSession() {
       
        if (TransactionSynchronizationManager.hasResource(this)) {
            return getCurrentSession();
        } else {
            return openSession();
        }
    }

    private Connection openSession() {
        Connection connection = null;
        try {
            connection = getIcyDataTemplate().getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
       
        TransactionSynchronization transactionSynchronization = new IcyTransaction(this);
        TransactionSynchronizationManager.registerSynchronization(transactionSynchronization);
        TransactionSynchronizationManager.bindResource(this, connection);
        System.out.println("打開新的connection");
        return connection;
    }

   
    private Connection getCurrentSession() {
        System.out.println("获取当前线程的 connection");
        return (Connection) TransactionSynchronizationManager.getResource(this);
    }

    public IcyDataTemplate getIcyDataTemplate() {
        return icyDataTemplate;
    }

    public void setIcyDataTemplate(IcyDataTemplate icyDataTemplate) {
        this.icyDataTemplate = icyDataTemplate;
    }

    public Connection getConnection() throws SQLException {
        return icyDataTemplate.getConnection();
    }

}

3 創建IcyTransaction

 import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import customerEnter.Frame.Error.FramErrorProcessing;
import customerEnter.Frame.Utils.Log4j;

/**
 * 
 * 类描述: 事物處理
 * 
 * 类名称:MyTransactionSynchronizationAdapter
 * 
 * 创建人:dy
 * 
 * 创建时间:2017-7-27 下午3:32:06
 * 
 */
public class IcyTransaction extends TransactionSynchronizationAdapter {

    private IcyDataTemplateFactory    icyDataTemplateFactory;

    public IcyTransaction(IcyDataTemplateFactory icyDataTemplateFactory) {
        this.icyDataTemplateFactory = icyDataTemplateFactory;
    }

    public void suspend() {
    }

    public void resume() {

    }

    public void beforeCompletion() {

    }

    @Override
    public void beforeCommit(boolean Isex) {
        if (!Isex) {
            Connection connection = (Connection) TransactionSynchronizationManager.getResource(icyDataTemplateFactory);
            System.out.println("開啟事物 " + connection);
        }
    }

    @Override
    public void afterCompletion(int status) {
        Connection connection = (Connection) TransactionSynchronizationManager.getResource(icyDataTemplateFactory);
        if (STATUS_COMMITTED == status) {
            try {
                connection.commit();
                System.out.println("提交 ");
            } catch (SQLException e) {
                System.out.println("提交失敗 ");
                System.out.println(e.getMessage());
            }
        } else {
            try {
                connection.rollback();
                System.out.println("回滾 ");
            } catch (SQLException e) {
                System.out.println("回滾失敗 ");
                System.out.println(e.getMessage());
            }
        }
        try {
            closeConn(connection);
        } catch (FramErrorProcessing e) {
            Log4j.setLog4j(getClass());
            Log4j.Log4JOutError("報錯 關閉鏈接" + e.getMessage());
        }
    }

    void closeConn(Connection connection) throws FramErrorProcessing {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new FramErrorProcessing(e);
        }
    }
}


然後分別在spring文件裡注入 icyDataTemplate和icyDataTemplateFactory

然後用spring獲取 icyDataTemplateFactory.getSession就是有事務的Connection

但是要在spring 文件里配置好註解方式的事務 然後在server 寫上事務註解 就可以了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值