我项目使用的数据库连接管理、事务管理类(欢迎拍砖)

原创 2011年12月27日 00:13:00

       我在项目中使用的数据库连接、以及事务操作的类,类中采用开源的apache Dbutils作为辅助,Bonecp做为数据源,使用时请加上Dbutils包,Bonncp包,还有Log4j包。

DbUtils下载地址为Dbutils下载


Bonecp下载地址为BonecP下载


Bonecp需要google的集合框架,下载地址为guava下载,还需要SLF4J日志库,下载地址为slf4j下载

import com.jolbox.bonecp.BoneCPConfig;
import com.jolbox.bonecp.BoneCPDataSource;
import org.apache.commons.dbutils.DbUtils;
import org.apache.log4j.Logger;
import tqw.core.exc.DaoException;
import tqw.util.Prop;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * <p>数据库连接帮助类,包括事务处理</p>
 * Created by 淘情网.
 * User: 吴红军.
 * Date: 11-12-15
 * Time: 上午2:20
 */
public final class DBUtil {
    private static final Logger log = Logger.getLogger(DBUtil.class);
    private static DataSource ds=null;
    private static final ThreadLocal<Connection> local=new ThreadLocal<Connection>();
    static {
        init();
    }
    public static void init(){
        Properties prop = Prop.getProperties("jdbc.properties");
        BoneCPConfig cfg= null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            cfg = new BoneCPConfig(prop);
            ds = new BoneCPDataSource(cfg);
        }catch (Exception ex){
            log.error("数据源加载出现错误!",ex);
            throw new DaoException("数据库源加载出现错误:"+ex.getMessage());
        }finally {
            if(cfg!=null){cfg=null;}
            if(prop!=null)prop.clear();
            prop=null;
        }
    }

    /**
     * 关闭连接方法
     */
    public static  void closeConn(){
        Connection conn = local.get();
        try {
            if(conn!=null&&!conn.isClosed()){
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException e) {
            log.error("无法关闭连接!!! ", e);
            throw new DaoException("关闭连接错误!!!",e);
        }finally {
            local.set(null);
        }
    }
    /**
     * 获取数据库连接
     * @return 数据库连接
     */
    public static Connection getConn() {
        Connection conn = local.get();
        try{
            if(null==conn||conn.isClosed()){
                //conn=bcp.getConnection();
                conn = ds.getConnection();
                local.set(conn);
            }
        }catch (SQLException e) {
            throw new DaoException("获取数据库连接出现错误!",e);
        }
        return conn;
    }
    /**
     * 断开连接池
     */
    public static void closeDataSource(){
        try {
            //bcp.close();
            ds.getClass().getMethod("close").invoke(ds);
        } catch (Exception e) {
            log.error("释放数据源发生错误!",e);
            throw new DaoException("释放数据源发生错误:"+e.getMessage());
        }
    }
    /**事务开始*/
    public static void begin(){
        try{
            Connection conn=getConn();
            if(null!=conn&&!conn.isClosed())
                conn.setAutoCommit(false);
        }catch (SQLException e){
            log.error("开启事务失败!",e);
            throw new DaoException("开启事务失败!",e);
        }
    }

    /**
     * 事务提交
     */
    public static void commit(){
        Connection conn=getConn();
        DbUtils.commitAndCloseQuietly(conn);
    }

    /**
     * 事务回滚
     */
    public static void rollback(){
        Connection conn=getConn();
        DbUtils.rollbackAndCloseQuietly(conn);
    }
    public static void close(){DBUtil.closeConn();}
    /**
     * 销毁方法
     */
    public static void destroy(){
        /**/
        closeDataSource();
        ds=null;
        //bcp=null;
        log.debug("释放数据源完毕......");
    }

}
上面源码中包含了一个异常类DaoException,是我在项目中为了统一异常,自定义的,如下:

/**
 * <p>数据库自定义异常</p>
 * Created by 淘情网.
 * User: 吴红军.
 * Date: 11-12-13
 * Time: 下午8:32
 */
public class DaoException extends RuntimeException{
    public DaoException(String s) {
        super(s);
    }

    public DaoException(String s, Throwable e) {
        super(s, e);
    }

    public DaoException(Throwable e) {
        super(e);
    }
}

属性读取方法Prop.getProperties(),因为Prop类不便公开,我这里提供这个方法吧,关闭文件流我用的是Apache的IO包,自行下载。

/**
	 * 根据配置文件读取一个属性文件
	 * @param is 配置文件路径文件流
	 * @return Properties
	 */
	public static Properties getProperties(InputStream is){
		Properties props=new Properties();
		try {
			props.load(is);
			return props;
		} catch (IOException e) {
			throw new SysException("读取配置文件错误!");
		}finally{
			IOUtils.closeQuietly(is);
		}
	}

    /**
     * 根据路径读取配置文件
     * @param name 路径名称
     * @return
     */
    public static Properties getProperties(String name){
        return getProperties(Thread.currentThread().getContextClassLoader().getResourceAsStream(name));
    }



其中用到了一个Properties属性文件,用来配置数据库地址,用户名和密码的,其他的属性请参考Bonecp属性,请放入你的类路径下,也可以自己更改路径,其中的属性根据你的项目自行修改,内容如下:

jdbcUrl=jdbc:mysql://localhost:3306/tqw?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
username=root
password=root
idleMaxAgeInMinutes=240
maxConnectionsPerPartition=30
minConnectionsPerPartition=10
partitionCount=2
closeConnectionWatch=false
closeConnectionWatchTimeoutInMs=0
logStatementsEnabled=true
#\u5f53\u8fde\u63a5\u6c60\u4e2d\u7684\u8fde\u63a5\u8017\u5c3d\u7684\u65f6\u5019 BoneCP\u4e00\u6b21\u540c\u65f6\u83b7\u53d6\u7684\u8fde\u63a5\u6570
acquireIncrement=5
statementsCacheSize=50
releaseHelperThreads=3



相关文章推荐

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

阅读目录 一、JDBC常用的API深入详解及存储过程的调用 1、存储过程(Stored Procedure)的介绍 2、JDBC调用无参存储过程 3、JDBC调用含输入参数存储过程 ...
  • wdk1011
  • wdk1011
  • 2017年07月30日 22:13
  • 157

Spring事务管理与数据库连接

1 如何获得连接  看DataSourceUtils代码  Java代码   protected static Connection doGetConnection(Data...

JDBC数据库连接和事务的管理 一个JDBC基本操作封装类的编写

Java使用JDBC建立数据库连接时,主要使用到了两个类:java.sql.Connection; java.sql.DriverManager;创建一个连接的基本过程为://注册驱动名 Class...

Maven构建SpringMVC项目实现注解、数据库事务管理及存储过程操作

Maven构建SpringMVC项目实现注解、数据库事务管理及存储过程操作

工作流管理系统开发之十 数据库连接及事务设定

为了方便设置数据库连接和事务的一致,将所有数据库连接信息统一设置在fcconfig.xml文件中;  fcconfig.xml的内容:         type="jdbc" ...

在Java中利用动态代理实现数据库连接与事务的自动管理

原文地址:http://blog.csdn.net/tsun7263/article/details/4585688 AOP(Aspect Oriented Programming,面向方面编程...

Java+Web项目企业事务管理系统源码

  • 2016年05月16日 15:10
  • 6.34MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我项目使用的数据库连接管理、事务管理类(欢迎拍砖)
举报原因:
原因补充:

(最多只允许输入30个字)