当前位置:编程学习 > JAVA >>

[Java]具备全程事务控制的JDBC连接管理器

  Hibernate事务具备全局管理能力,配合Spring框架就可以在BO层完成DAO操作和事务控制。当然,传统的JDBC是不具备这个能力的,所以要自己开发一个连接管理器框架,来管理线程范围内的数据库连接和事务控制。

[java] 
package edu.softparty.base.dbunit; 
 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
 
import javax.sql.DataSource; 
 
/**
 * 连接管理器类
 */ 
public class ConnectionManager { 
 
    /**
     * 空的事务对象
     */ 
    private static final Transaction EMPTY_TRANSACTION = new Transaction() { 
        public void rollback() throws SQLException { 
        } 
        public void commit() throws SQLException { 
        } 
    }; 
 
    /**
     * 负责提交和回滚的事务对象
     */ 
    private static final Transaction TRANSACTION = new Transaction() { 
        public void rollback() throws SQLException { 
            Connection connection = connectionHolder.get(); 
            if (connection != null) { 
                if (connection.getAutoCommit() == false) { 
                    connection.rollback(); 
                } 
                connection.close(); 
                connectionHolder.remove(); 
            } 
        } 
         
        public void commit() throws SQLException { 
            Connection connection = connectionHolder.get(); 
            if (connection != null) { 
                if (connection.getAutoCommit() == false) { 
                    connection.commit(); 
                } 
                connection.close(); 
                connectionHolder.remove(); 
            } 
        } 
    }; 
 
 
    // 线程本地对象管理器 
    private static final ThreadLocal<Connection> connectionHolder = new ThreadLocal<>(); 
 
    // 数据源 
    private DataSource dataSource; 
 
    /**
     * 构造器
     * @param dataSource 数据源对象
     */ 
    ConnectionManager(DataSource dataSource) { 
        this.dataSource = dataSource; 
    } 
 
    /**
     * 获取数据库连接
     * @return 数据库连接
     * @throws SQLException
     */ 
    public Connection getConnection() throws SQLException { 
        Connection connection = connectionHolder.get(); 
        if (connection == null) { 
            connection = dataSource.getConnection(); 
            connectionHolder.set(connection); 
        } 
        return connection; 
    } 
 
    /**
     * 启动事务
     * @return 事务管理对象
     * @throws SQLException
     */ 
    public Transaction beginTransaction() throws SQLException { 
        Connection connection = getConnection(); 
        if (connection.getAutoCommit()) { 
            connection.setAutoCommit(false); 
        } 
        return TRANSACTION; 
    } 
 
    /**
     * 获取事务
     * @return
     * @throws SQLException
     */ 
    public Transaction getTransaction() { 
        return connectionHolder.get() == null ? EMPTY_TRANSACTION : TRANSACTION; 
    } 
 
    /**
     * 关闭数据库连接
     * @throws SQLException
     */ 
    public void close() throws SQLException { 
        Connection connection = connectionHolder.get(); 
        if (connection != null) { 
            connection.close(); 
            connectionHolder.remove(); 
        } 
    } 
 
    /**
     * 释放资源
     * @param rs 结果集对象
     * @param stm 命令集对象
     * @throws SQLException
     */ 
    public void release(ResultSet rs, Statement stm) throws SQLException { 
        if (rs != null) { 
            rs.close(); 
        } 
        if

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,