package com.xx.questionnaire.util.dao;

 import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.log4j.Logger; /**
* @version 0.1
* @author Administrator
*
*/
public class Dbcp_connection implements JdbcI {
static Logger log = Logger.getLogger(Dbcp_connection.class);
private Connection connection;
/**
* 在静态块中初始化获得DBCP数据源连接池
*/
static {
getDataSource();
log.info("数据源已在静态块中初始化完成。");
} /**
*@return 返回Connection连接
*/
public Connection getConnection() {
if (connection == null || connection.equals("")) {
try {
setConnection(getDataSource().getConnection());
log.info("从数据源中获取连接!");
return connection;
} catch (SQLException e) {
log.error("对不起,数据库连接获取失败!");
e.printStackTrace();
}
}
return null;
}
/**
* @param sql SQL语句
* @return PrepaedStatement对象
*/
public PreparedStatement getPStatement(String sql) {
if (sql == null || sql.equals("")) {
log.error("错误,SQL语句不允许为空!");
return null;
}
PreparedStatement ps = null;
try {
ps = getConnection().prepareStatement(sql);
log.info("SQL语句" + sql + "已经过预编译!");
return ps;
} catch (SQLException e) {
log.error("异常,SQL语句" + sql + "预编译失败!");
e.printStackTrace();
} return null;
} /**
* 强制释放Connection连接。
*
*/
public void close() {
try {
this.connection.close();
log.info("Connection object" + this.connection.hashCode()
+ "被强制释放!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public void close(Statement ps) {
// TODO Auto-generated method stub
try { ps.close();
this.connection.close();
log.info("Statement("
+ ps.hashCode() + "),Connection("
+ this.connection.hashCode() + ")已被释放!");
} catch (SQLException e) {
log.error("异常,JDBC对象关闭失败!");
e.printStackTrace();
} }
/**
* 按照顺序释放JDBC连接。
*/
public void close(Statement ps, ResultSet rs) {
// TODO Auto-generated method stub
try {
rs.close();
ps.close();
this.connection.close();
log.info("ResultSet(" + rs.hashCode() + "),Statement("
+ ps.hashCode() + "),Connection("
+ this.connection.hashCode() + ")已被释放!");
} catch (SQLException e) {
log.error("异常,JDBC对象关闭失败!");
e.printStackTrace();
} } public static void main(String[] args) {
// TODO Auto-generated method stub
/* 1 */
DataSource dds = getDataSource();
System.out.println(dds == null ? "数据源失败" : "数据源成功"); } /**
* 全局公用的数据源
*
* @return DataSource Object
*/
private static DataSource getDataSource() {
String dbcpUrl = "dbcp-mysql.properties"; DataSource ds;
Properties p = new Properties();
try {
// 通过类的类加载器将属性文件加载至输入流
p.load(JDBCUtil.class.getClassLoader().getResourceAsStream(dbcpUrl));
log.info("DBCP配置文件已加载!"); ds = BasicDataSourceFactory.createDataSource(p);
log.info("数据源获取成功!");
return ds; } catch (IOException e) {
log.error("异常,可能是配置文件读取失败。");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} return null;
} private void setConnection(Connection connection) {
log.info("获取连接,Hash地址为:" + connection.hashCode());
this.connection = connection;
} public DataSource getDS() {
// TODO Auto-generated method stub
log.info("数据源被外部调用!");
return getDataSource();
} }

新手写的一个DBCP工具类的更多相关文章

  1. 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...

  2. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  3. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

  4. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  5. 分享一个Snackbar工具类 SnackbarUtils;

    分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短                 1.1:Snackbar.LEN ...

  6. 编写Java程序,创建一个数学工具类,将该类设计为final类,Final 修饰符的使用。

    返回本章节 返回作业目录 需求说明: 创建一个数学工具类. 将该类设计为final类. 将该类的构造方法的访问权限定义为私有,以防止外界实例化该类. 在该类定义静态double类型常量π,其值为3.1 ...

  7. 手写一个LRU工具类

    LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...

  8. [分享]一个String工具类,也许你的项目中会用得到

    每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...

  9. 编写一个数组工具类, 编写本软件的 帮助文档(API文档)

    本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...

随机推荐

  1. command 'gcc' failed with exit status 1

    https://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-insta ...

  2. 安卓输入子系统之inotify与epoll机制【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在安卓的输入子系统中如何监听文件的产生 ...

  3. apply current folder view to all folders

    https://www.tenforums.com/tutorials/35093-apply-folder-view-all-folders-same-type-windows-10-a.html ...

  4. FMDB数据库队列

    一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05- ...

  5. BZOJ_2819_Nim_树状数组维护出栈入栈序

    BZOJ_2819_Nim_树状数组维护出栈入栈序 Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任 ...

  6. Python+页面元素高亮源码实例

    简单写了一个页面元素高亮的方法,原理就是在python中调用js实现元素高亮,分享一下源码如下: 1.元素高亮源码 Js调用 js = "var q=document.getElementB ...

  7. bzoj 3709: [PA2014]Bohater【贪心】

    先打能回血的,按消耗从小到大打: 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样): 中间体力小于0就输出无解 #include<iostream> #include& ...

  8. P4170 [CQOI2007]涂色

    传送门 区间dp,设\(f[l][r]\)表示区间\((l,r)\)的最小次数,当\(l==r\)时为\(1\),当\(s[l]==s[r]\)时为\(min(f[l][r-1],f[l+1][r]) ...

  9. .NET Core 跨平台物联网开发:SDK 属性、方法、委托、类(四)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  10. C# DateTime.Now 详解

    //2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...