新手写的一个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的类, ...
随机推荐
- 定时任务 bash 对远程数据库 备份 读写
1g表 每行都有可能被更新,故全表备份 检测备份是否在进行 [root@hadoop1 ~]# netstat --numeric-ports | grep 3306tcp 0 ...
- [Unity3D]Unity3D游戏开发之连续滚动背景
在诸如天天跑酷等2D游戏中.因为游戏须要表现出运动的感觉.通常都会使游戏背景连续循环滚动以增强视觉效果,那么今天.博主就来带领大家一起来实现连续滚动背景吧. 首先来讲述一下原理.准备两张连续的图片(博 ...
- 利用JS 阻止表单提交
情景一:不存在Ajax异步操作 1 使用背景:会议室预定管理系统中,当表单提交的时候需要验证预约的时间是否符合预定规则(不需要通过访问服务器),否则提示错误信息,阻止表单提交. 2 相关技术点: fo ...
- 并不对劲的bzoj4652:loj2085:uoj221:p1587:[NOI2016]循环之美
题目大意 对于已知的十进制数\(n\)和\(m\),在\(k\)进制下,有多少个数值上互不相等的纯循环小数,可以用\(x/y\)表示,其中 \(1\leq x\leq n,1\leq y\leq m\ ...
- Memcache存储大数据的问题(大于1m)
Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题. 我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql se ...
- ie7 总结
1 ie7 对部分属性选择器严重区分大小写 在HTML中,属性名,例如id, title之类是不区分大小写的,CSS中的选择器也应该是如此.但是IE7对属性名是严格区分大小写的! 2 关于属性选择器, ...
- 使用VS进行打包程序解决生成两个文件的问题(压缩后只有一个exe)
使用VS打包创建setup相信大家都挺熟的了,不熟的话网上也有很多,就不做介绍了,现在给大家写下怎么将生成的那些文件夹以及setup.exe和.msi 文件打包成一个exe 我们这里使用的是Winra ...
- Find offset of first/last found substring
DATA: TEXT TYPE STRING VALUE 'RO_LL_OVER BEET_HOVEN', MOFF TYPE I VALUE '-1'. FIND FIRST OCCURRENCE ...
- bzoj 1511: [POI2006]OKR-Periods of Words【kmp】
n-ne[n]是n的最长循环节长度,其实就是n-最短前缀=后缀长度 然后我们要求最短循环节,其实就是ne一直往前跳,跳到不能跳为止,这时的n-ne[n]就是n的最短循环节长度 #include< ...
- spoj 962 IM - Intergalactic Map【最大流】
因为是无向图,所以从1到2再到3等于从2到1和3.用拆点来限制流量(i,i+n,1),然后连接(s,2+n,1),(1,t,1),(3,t,1),对于原图中的边连接(x+n,y,1)(y+n,x,1) ...