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

原创 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事务管理种类

java事务管理 分类: java2007-08-20 14:58 8795人阅读 评论(2) 收藏 举报 javajdbcspringhibernate数据库框架   什么是...
  • w1014074794
  • w1014074794
  • 2015年04月07日 23:41
  • 704

URTracker事务跟踪系统

来北京交控科技上班,接到的任务是维护URTracker系统。 我之前做过ITOO平台权限管理系统,它权限控制现在只能控制到页面级别,而URTracker可以控制到按钮级,可以说是一款非常强大的权限管理...
  • u013040472
  • u013040472
  • 2016年05月15日 20:28
  • 701

Spring管理事物应用到实际的项目中--编程式事物

接着上一篇博客来写。。。 下面来看一下如何将Spring管理事物应用到实际的项目中,为了简化实现,这里只定义最简单的模型对象和不完整的DAO和Service层接口 1、定义项目中的模型对象,这...
  • cwzhsi
  • cwzhsi
  • 2014年11月30日 11:07
  • 1324

管理类-项目管理-处事管理

链接:http://kb.cnblogs.com/page/119555/ 项目管理的“三边六拍”!   文/张传波   “三边”是指:边计划、边实施、边修改,“六拍...
  • u012718713
  • u012718713
  • 2016年03月31日 16:11
  • 199

Spring事务管理失效的原因

个人认为, spring的声明式事务是spring让人感觉用的最爽的功能之一. 可是在有些时候, 我们使用spring的声明式事务时却并没有效果. 是spring的问题吗? 下面我们先大致说明一下sp...
  • andybbc
  • andybbc
  • 2016年10月24日 17:20
  • 1733

Android项目之线程池管理

我们做项目的时候不可避免要接触到联网操作或者一些本地的耗时操作,而这些操作不是在主线程里面进行,会导致ANR异常(卡UI),所以我们要开辟子线程来执行这些操作,然而直接new Thread()会导致...
  • zz6880817
  • zz6880817
  • 2016年02月17日 11:40
  • 543

Unity3d游戏开发框架-标志量-数学管理类-时间管理-Log日志管理

新建一个文件夹:Util 新建C#文件: 1.GmagFalag.cs 2.Log.cs 3.MathUtilLite.cs 4.TimeMgr.csusing UnityEngine; u...
  • u013108312
  • u013108312
  • 2016年08月31日 18:23
  • 777

unity,C#各种管理类(二)-- UI管理

1.UI,中心点,画布,枚举值 //当前工程的窗口文件的枚举值 //UI public enum WinType { BagWin, ButtonWin, HeadWin...
  • GaoHeShun
  • GaoHeShun
  • 2017年03月29日 10:01
  • 382

线程池管理类 Executors

可以构建三种线程池,区别就在于执行子线程的时候有几个线程供子线程使用        搞一个子线程类,如下: public class MyThread implements Runnable { ...
  • xiaoma_fan
  • xiaoma_fan
  • 2016年03月18日 14:45
  • 219

Spring事务管理(详解+实例)

写这篇博客之前我首先读了《Spring in action》,之后在网上看了很多关于Spring事务管理的文章,具体参考文章如下: 1、将相应的接口依赖图理清出 2、将每个类的具体配置弄明白 3...
  • Trigl
  • Trigl
  • 2016年03月25日 23:20
  • 26599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我项目使用的数据库连接管理、事务管理类(欢迎拍砖)
举报原因:
原因补充:

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