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. Win10快捷键总结

    微软自发布Windows10以来,大部分的电脑系统都已更新.除了大量的新功能和界面改进,Windows 10中同样包含了一批新的键盘快捷键.熟练使用这些快捷键可以大大提高操作效率,很实用,推荐大家收藏 ...

  2. 网页动画插件---Super Scrollorama , TweenMax 和skrollr

    SuperScrollorama 是一个用来实现超酷的滚动动画效果的 jQuery 插件. 实现的效果有:文字褪色,飞,旋转,缩放,斯马什,针脚,滑动,隐退,反弹,颜色,扔,移动,视差. 地址:htt ...

  3. java中字节数组byte[]和字符(字符串)之间的转换

    转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...

  4. CentOS6.0忘记root密码解决办法

    说明操作系统:CentOS 6.0遇到问题:忘记管理员账号root的密码,进不了系统解决办法:重置root密码为123456操作: 开机启动系统,在进入系统之前按键盘上面的Esc键,会进入下面的界面 ...

  5. 03_隐式意图打开activity

    想让第一个activity把第二个activity打开的话,在清单文件里面声明一下并且 右键Debug As Android Application居然没有报错 mimeType  讲HTML的时候就 ...

  6. Tomcat相关的LNMT和LAMT

    Tomcat相关的LNMT和LAMT LNMT:Linux Nginx MySQL Tomcat Client (http) --> nginx (reverse proxy)(http) -- ...

  7. strcpy(转载)

    转自:http://www.kuqin.com/clib/string/strcpy.html 原型:extern char *strcpy(char *dest,char *src); 用法:#in ...

  8. HDU1072:Nightmare

    传送门 题意 给出一张n*m的图 0.墙 1.可走之路 2.起始点 3.终点 4.时间重置点 问是否能到达终点 分析 我的训练专题第一题,一开始我设个vis数组记录,然后写炸,不能处理重置点根vis的 ...

  9. poj 1637 Sightseeing tour【最大流+欧拉路】

    参考:https://www.cnblogs.com/kuangbin/p/3537525.html 这篇讲的挺好的 首先分清欧拉路和欧拉环: 欧拉路:图中经过每条边一次且仅一次的路径,要求只有两个点 ...

  10. oracle ORA-01704: string literal too long问题分析

    今天使用sql在oracle直接insert update一个表时,出现ORA-01704: string literal too long的错误,我们的sql是 update mall_config ...