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. LIKIE INSTR

    SELECT  url FROM test_url WHERE   FROM_UNIXTIME(create_time,'%Y%m%d %H') < '20171218 00'  AND  no ...

  2. VCL代码的一些设计手法(使用OO虚函数的技巧)

    1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位) ...

  3. mipi屏在内核可以显示logo但是u-boot无法显示的问题【转】

    本文转载自:http://blog.csdn.net/fulinus/article/details/45071721 平台:瑞芯的rk3288 u-boot版本:u-boot-2014.10 ker ...

  4. unbantu安装mysql

    1,方法一 sudo apt-get install mysql-server apt isntall mysql-client apt install libmysqlclient-dev(暂不知用 ...

  5. C# WinForm开发系列 - Form/Window

    Form是WinForm开发中非常重要的一个控件, 本文将包含如何制作一个关于对话框,系统载入提示窗体, 创建类似于QQ提示框以及创建不规则窗体等(文章及相关代码搜集自网络,仅供学习参考,版权属于原作 ...

  6. 使用Visual Studio 利用WinGDB编译和远程调试嵌入式Linux的程序

    写这篇文章的目的在于帮助那些既要使用Visual Studio编写程序又要开发和调试嵌入式Linux 程序的苦命程序员们! 第一步, 安装 WinGDB ,下载位置  http://www.wingd ...

  7. 【转】python中获得当前目录和上级目录

    原文地址:http://blog.csdn.net/liuweiyuxiang/article/details/71154346 获取当前文件的路径: from os import path d = ...

  8. bzoj3620

    KMP 我似乎复杂度写的不对... 因为位置相同只算一次,后缀数组什么的都不管用了,我们就暴力kmp,但是我写的是暴力跳...竟然过了...我写bzoj3670才发现... #include<c ...

  9. MFC绘图

    //20171/121 两点一线 比如鼠标左击和鼠标弹起的两个消息 然后响应从而获取一条线2 添加响应函数方法 类图->右击->addwindowsmessage3 Dview和main中 ...

  10. ExtJS 4 MVC 创建 Viewport

    http://ext4all.com/post/extjs-4-mvc-with-viewport 效果图: 结构图: 没有用到Model层,直接在view里面写上 默认的 json的数据 中间Pan ...