Java数据库连接池-proxool
连接池技术的思想:
连接复用(高效、安全),避免数据库频繁建立、关闭的开销
--------------------极客学院(参考lulei)
1.配置文件
<proxool>
<!-- 连接池别名 -->
<alias>localmysqldb</alias>
<!-- 连接数据库的驱动URL -->
<driver-url><![CDATA[jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8]]></driver-url>
<!-- 连接数据库的驱动类 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root"/>
<property name="password" value="ROOT"/>
</driver-properties>
<!-- 处于睡眠的最大时间 -->
<house-keeping-sleep-time>900000</house-keeping-sleep-time>
<!-- 连接的最大活动时间 -->
<maximum-active-time>500000</maximum-active-time>
<!-- 最大的连接数量 -->
<maximum-connection-count>10</maximum-connection-count>
<!-- 最小的连接数量 -->
<minimum-connection-count>4</minimum-connection-count>
<!-- 检测连接是否处于空闲状态,执行这条语句来测试 -->
<house-keeping-test-sql>select 1</house-keeping-test-sql>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
</proxool>
</proxool-config>
2。工具类
public class ClassUtil {
/**
* @param c
* @return
* @Author:
* @Description: 返回class文件所在的目录
*/
public static String getClassPath(Class<?> c) {
return c.getResource("").getPath().replaceAll("%20", " ");
}
/**
* @param c
* @return
* @Author:
* @Description: 返回class文件所在项目的根目录
*/
public static String getClassRootPath(Class<?> c) {
return c.getResource("/").getPath().replaceAll("%20", " ");
}
/**
* @param c
* @param hasName 是否包括class名
* @return
* @Author:
* @Description: 返回class文件所在的目录
*/
public static String getClassPath(Class<?> c, boolean hasName) {
String name = c.getSimpleName() + ".class";
String path = c.getResource(name).getPath().replaceAll("%20", " ");
if (hasName) {
return path;
} else {
return path.substring(0, path.length() - name.length());
}
}
}
3.数据库连接池配置加载类
public class DBPool {
private String poolPath;//数据库连接池的配置文件路径
private DBPool() {
}
/**
* @return
* @Author:
* @Description: 返回DBPool对象
*/
public static DBPool getDBPool() {
return DBPoolDao.dbPool;
}
/**
*@Description: 静态内部类实现单例模式
*@Author:
*@Version:1.1.0
*/
private static class DBPoolDao{
private static DBPool dbPool = new DBPool();
}
public String getPoolPath() {
if (poolPath == null) {
//如果poolPath为空,赋值为默认值
poolPath = ClassUtil.getClassRootPath(DBPool.class) + "proxool.xml";
}
return poolPath;
}
/**
* @param poolPath
* @Author:
* @Description: 设置数据库连接池的配置文件路径
*/
public void setPoolPath(String poolPath) {
this.poolPath = poolPath;
}
}
4.数据库连接池管理类
public class DBManager {
private DBManager(){
try {
//数据库连接池配置文件
JAXPConfigurator.configure(DBPool.getDBPool().getPoolPath(), false);
//数据库加载驱动类
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param poolName
* @return
* @throws SQLException
* @Author:
* @Description: 获取数据库连接
*/
public Connection getConnection(String poolName) throws SQLException {
return DriverManager.getConnection(poolName);
}
/**
*@Description: 内部静态类实现单例模式
*@Author:
*@Version:1.1.0
*/
private static class DBManagerDao {
private static DBManager dbManager = new DBManager();
}
/**
* @return
* @Author:
* @Description: 返回数据库连接池管理类
*/
public static DBManager getDBManager() {
return DBManagerDao.dbManager;
}
}
5. sql语句参数转化
public class DBOperation {
private String poolName;//数据库连接池别名
private Connection con = null;//数据库连接
public DBOperation(String poolName) {
this.poolName = poolName;
}
/**
* @Author:
* @Description:关闭数据库连接
*/
public void close() {
try {
if (this.con != null) {
this.con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @throws SQLException
* @Author:lulei
* @Description: 打开数据库连接
*/
private void open() throws SQLException {
//先关闭后打开,防止数据库连接溢出
close();
this.con = DBManager.getDBManager().getConnection(this.poolName);
}
/**
* @param sql
* @param params
* @return
* @throws SQLException
* @throws ClassNotFoundException
* @Author:
* @Description: sql语句参数转化
*/
private PreparedStatement setPres(String sql, HashMap<Integer, Object> params) throws SQLException, ClassNotFoundException{
if (null == params || params.size() < 1) {
return null;
}
PreparedStatement pres = this.con.prepareStatement(sql);
for (int i = 1; i <= params.size(); i++) {
if (params.get(i) == null) {
pres.setString(i, "");
} else if (params.get(i).getClass() == Class.forName("java.lang.String")) {
pres.setString(i, params.get(i).toString());
} else if (params.get(i).getClass() == Class.forName("java.lang.Integer")) {
pres.setInt(i, (Integer) params.get(i));
} else if (params.get(i).getClass() == Class.forName("java.lang.Long")) {
pres.setLong(i, (Long) params.get(i));
} else if (params.get(i).getClass() == Class.forName("java.lang.Double")) {
pres.setDouble(i, (Double) params.get(i));
} else if (params.get(i).getClass() == Class.forName("java.lang.Flaot")) {
pres.setFloat(i, (Float) params.get(i));
} else if (params.get(i).getClass() == Class.forName("java.lang.Boolean")) {
pres.setBoolean(i, (Boolean) params.get(i));
} else if (params.get(i).getClass() == Class.forName("java.sql.Date")) {
pres.setDate(i, java.sql.Date.valueOf(params.get(i).toString()));
} else {
return null;
}
}
return pres;
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 执行SQL语句,返回影响行数
*/
public int executeUpdate(String sql) throws SQLException {
this.open();
Statement state = this.con.createStatement();
return state.executeUpdate(sql);
}
/**
* @param sql
* @param params
* @return
* @throws SQLException
* @throws ClassNotFoundException
* @Author:
* @Description: 执行sql语句,返回影响行数
*/
public int executeUpdate(String sql, HashMap<Integer, Object> params) throws SQLException, ClassNotFoundException {
this.open();
PreparedStatement pres = setPres(sql, params);
if (null == pres) {
return 0;
}
return pres.executeUpdate();
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 执行sql语句,返回结果集
*/
public ResultSet executeQuery(String sql) throws SQLException {
this.open();
Statement state = this.con.createStatement();
return state.executeQuery(sql);
}
/**
* @param sql
* @param params
* @return
* @throws SQLException
* @throws ClassNotFoundException
* @Author:
* @Description:执行sql语句,返回结果集
*/
public ResultSet executeQuery(String sql, HashMap<Integer, Object> params) throws SQLException, ClassNotFoundException {
this.open();
PreparedStatement pres = setPres(sql, params);
if (null == pres) {
return null;
}
return pres.executeQuery();
}
}
6.数据基本操作
public class DBServer {
private DBOperation dbOperation;
public DBServer(String poolName) {
dbOperation = new DBOperation(poolName);
}
/**
* @Author:
* @Description: 关闭数据库连接
*/
public void close() {
dbOperation.close();
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 数据库新增操作
*/
public int insert(String sql) throws SQLException {
return dbOperation.executeUpdate(sql);
}
/**
* @param tableName
* @param columns
* @param params
* @return
* @throws SQLException
* @throws ClassNotFoundException
* @Author:
* @Description: 数据库新增操作
*/
public int insert(String tableName, String columns, HashMap<Integer, Object> params) throws SQLException, ClassNotFoundException {
String sql = insertSql(tableName, columns);
return dbOperation.executeUpdate(sql, params);
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 数据库删除操作
*/
public int delete(String sql) throws SQLException {
return dbOperation.executeUpdate(sql);
}
/**
* @param tableName
* @param condition
* @return
* @throws SQLException
* @Author:lulei
* @Description: 数据库删除操作
*/
public int delete(String tableName, String condition) throws SQLException {
if (null == tableName) {
return 0;
}
String sql = "delete from " + tableName + " " + condition;
return dbOperation.executeUpdate(sql);
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 数据库更新操作
*/
public int update(String sql) throws SQLException {
return dbOperation.executeUpdate(sql);
}
/**
* @param tableName
* @param columns
* @param condition
* @param params
* @return
* @throws SQLException
* @throws ClassNotFoundException
* @Author:
* @Description: 数据库更新操作
*/
public int update(String tableName, String columns, String condition, HashMap<Integer, Object> params) throws SQLException, ClassNotFoundException {
String sql = updateSql(tableName, columns, condition);
return dbOperation.executeUpdate(sql, params);
}
/**
* @param sql
* @return
* @throws SQLException
* @Author:
* @Description: 数据库查询操作
*/
public ResultSet select(String sql) throws SQLException {
return dbOperation.executeQuery(sql);
}
/**
* @param tableName
* @param columns
* @param condition
* @return
* @throws SQLException
* @Author:lulei
* @Description: 数据库查询操作
*/
public ResultSet select(String tableName, String columns, String condition) throws SQLException {
String sql = "select " + columns + " from " + tableName + " " + condition;
return dbOperation.executeQuery(sql);
}
/**
* @param tableName
* @param columns
* @param condition
* @return
* @Author:
* @Description: 组装 update sql eg: update tableName set column1=?,column2=? condition
*/
private String updateSql(String tableName, String columns, String condition) {
if (tableName == null || columns == null) {
return "";
}
String[] column = columns.split(",");
StringBuilder sb = new StringBuilder();
sb.append("update ");
sb.append(tableName);
sb.append(" set ");
sb.append(column[0]);
sb.append("=?");
for (int i = 1; i < column.length; i++) {
sb.append(", ");
sb.append(column[i]);
sb.append("=?");
}
sb.append(" ");
sb.append(condition);
return sb.toString();
}
/**
* @param tableName
* @param columns
* @return
* @Author:
* @Description: 组装 insert sql eg: insert into tableName (column1, column2) values (?,?)
*/
private String insertSql(String tableName, String columns) {
if (tableName == null || columns == null) {
return "";
}
int n = columns.split(",").length;
StringBuilder sb = new StringBuilder("");
sb.append("insert into ");
sb.append(tableName);
sb.append(" (");
sb.append(columns);
sb.append(") values (?");
for (int i = 1; i < n; i++) {
sb.append(",?");
}
sb.append(")");
return sb.toString();
}
}
Java数据库连接池-proxool的更多相关文章
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...
- Java数据库连接池详解
http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 对于共享资源,有一个很著名的设计模式:资源池(Resource P ...
- 数据库连接池proxool的两种使用方式
数据库连接池可以通过两种方式来应用,针对web应用和非web应用而来. 非web应用的数据库连接池配置 第一种方式:工厂类 非web应用可以使用工厂模式将数据库连接创建封装在一个工具类中,工具类中又使 ...
- Java数据库连接池封装与用法
Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- 一个JAVA数据库连接池实现源码
原文链接:http://www.open-open.com/lib/view/open1410875608164.html // // 一个效果非常不错的JAVA数据库连接池. // from:htt ...
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...
- [转帖]为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用
为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用 原创Clement-Xu 发布于2015-07-17 15:53:14 阅读数 57066 收藏 展开 HiKariCP是 ...
- Java数据库连接池比较(c3p0,dbcp,proxool和BoneCP)
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp21 Java框架数据库连接池比较(c3p0,dbcp和proxool,Bo ...
随机推荐
- Android如何在初始化的时候获取加载的布局的宽高
在自定义ListView中,需要将下拉刷新的View在初始化的时候设置padding隐藏起来,这时就要在初始化的时候获得要加载的布局View的高度. private View headView; he ...
- eclipse中编写代码时如何自动提示变量名?
打开 Eclipse -> Window -> Perferences -> Java -> Editor -> Content Assist,在右边最下面一栏找到 a ...
- 35 个你也许不知道的 Google 开源项目
转载自:http://blog.csdn.net/cnbird2008/article/details/18953113 Google是支持开源运动的最大公司之一,它们现在总共发布有超过500个的开源 ...
- emqtt新版升级一些事项和操作
注解 Erlang/OTP R19依赖lksctp-tools库 yum install lksctp-tools 控制台地址: http://127.0.0.1:18083,默认用户: admin, ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- 【spoj1182/usaco-Cow Queueing, 2003 Dec-二进制编号】数位dp
题意:定义新的排序:先按一个数中二进制中1的个数从小到大排序,如果1的个数相同则按数的大小从小到大排序.问[A,B]之间有第K大的数是哪个.-2^31<=A,B<=2^31(A,B必定同正 ...
- javascript 事件知识集锦
1.事件委托极其应用 转载的链接: http://www.webhek.com/event-delegate/#comments 2. 解析javascript事件机制 转载链接: http: ...
- vim 实现括号以及引号的自动补全
编辑文件/etc/vim/vimrc sudo vim /etc/vim/vimrc 在最后添加 inoremap ( ()<ESC>i inoremap [ []<ESC>i ...
- 破解邻居家的wifi密码
刚刚学习了如何破解wifi密码 然后昨天晚上连续破解了两个 好激动 我是在ubuntu上面使用aircrack-ng套件进行破解的 首先进行抓包,然后跑字典就ok了 下面的不错 一.关闭网络和结束可能 ...
- Linux实际用户(组)ID,有效用户(组)ID,设置用户(组)ID
实际用户(组)ID: 标识用户是谁,这两个字段在登录时取自口令文件中的登录项. 有效用户(组)ID: 决定了对文件的访问权限,通常有效用户(组)ID等于实际用户(组)ID,谁运行有效ID就等于谁的实际 ...