新手写的一个DBCP工具类
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工具类的更多相关文章
- 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)
一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...
- java中定义一个CloneUtil 工具类
其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...
- 我写的一个ExcelHelper通用类,可用于读取或生成数据
读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...
- 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成
写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...
- 分享一个Snackbar工具类 SnackbarUtils;
分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短 1.1:Snackbar.LEN ...
- 编写Java程序,创建一个数学工具类,将该类设计为final类,Final 修饰符的使用。
返回本章节 返回作业目录 需求说明: 创建一个数学工具类. 将该类设计为final类. 将该类的构造方法的访问权限定义为私有,以防止外界实例化该类. 在该类定义静态double类型常量π,其值为3.1 ...
- 手写一个LRU工具类
LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...
- [分享]一个String工具类,也许你的项目中会用得到
每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...
- 编写一个数组工具类, 编写本软件的 帮助文档(API文档)
本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...
随机推荐
- command 'gcc' failed with exit status 1
https://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-insta ...
- 安卓输入子系统之inotify与epoll机制【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在安卓的输入子系统中如何监听文件的产生 ...
- apply current folder view to all folders
https://www.tenforums.com/tutorials/35093-apply-folder-view-all-folders-same-type-windows-10-a.html ...
- FMDB数据库队列
一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05- ...
- BZOJ_2819_Nim_树状数组维护出栈入栈序
BZOJ_2819_Nim_树状数组维护出栈入栈序 Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任 ...
- Python+页面元素高亮源码实例
简单写了一个页面元素高亮的方法,原理就是在python中调用js实现元素高亮,分享一下源码如下: 1.元素高亮源码 Js调用 js = "var q=document.getElementB ...
- bzoj 3709: [PA2014]Bohater【贪心】
先打能回血的,按消耗从小到大打: 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样): 中间体力小于0就输出无解 #include<iostream> #include& ...
- P4170 [CQOI2007]涂色
传送门 区间dp,设\(f[l][r]\)表示区间\((l,r)\)的最小次数,当\(l==r\)时为\(1\),当\(s[l]==s[r]\)时为\(min(f[l][r-1],f[l+1][r]) ...
- .NET Core 跨平台物联网开发:SDK 属性、方法、委托、类(四)
系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四) SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...
- C# DateTime.Now 详解
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...