- 浏览: 410748 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (347)
- java基础 (58)
- ajax (10)
- s2sh (10)
- 版本控制 (4)
- 数据库 (34)
- 服务器 (4)
- 开发工具 (8)
- javascript (15)
- soockte (5)
- ext (2)
- 环境搭建 (7)
- struts2 (9)
- 找工作中的面试技巧 (2)
- 承接网站零活 (0)
- JNI+JONSE+OGNL (8)
- 性能优化 (4)
- Android开发 (5)
- xul (8)
- jquery (2)
- 线程 (3)
- jsp+jdbc (7)
- servlet (2)
- java对xml操作 (1)
- IO流的操作 (10)
- 项目开发前配置 (1)
- css (0)
- 上传、下载 (2)
- 知识探讨 (2)
- html (2)
- HQL (0)
- 工作技巧 (1)
- IT (1)
- Hibernate杂谈 (10)
- Spring杂谈 (35)
- DWR (5)
- JUnit测试 (3)
- EasyMock测试web (1)
- ibatis (6)
- maysql (5)
- C++ (0)
- 正则表达式(解剖) (1)
- 密码安全 (2)
- 上传 (1)
- socket (1)
- jni(java与c++结合) (1)
- jdk版本问题 (0)
- tomcat版本问题 (5)
- linux基本命令(初学) (7)
- linux项目发布 (1)
- 3年的经验总结 (1)
- 加解密 (2)
- 高级java阶段 (2)
- java内存分区 (1)
- 浏览器 (1)
- 职业规划 (1)
- 管理 (5)
- java语音 (1)
- SSH (1)
- jsp (3)
- extjs (1)
- uml (2)
- 加密 (1)
- web (2)
- Ant (1)
- 自述 (1)
- Linux (1)
- ssh源码解剖 (1)
- 代码优化 (1)
- 设计模式 (0)
- xml (2)
- JOSN (1)
- scala (0)
- hadoop (0)
- spark (0)
- hana (1)
- shior (1)
- java Word (6)
- java PDF (4)
- java Excel (0)
最新评论
-
高级java工程师:
ztao2333 写道谢谢。收藏下这个总结。呵呵
温习jdk和tomcat -
ztao2333:
大写的,不是大学的
温习jdk和tomcat -
ztao2333:
谢谢。收藏下这个总结。
温习jdk和tomcat -
the_small_base_:
你好,可以提供调用方法吗?需要的Jar,能发下源码吗?谢谢
java实现语音 -
高级java工程师:
文思涌动 写道楼主新年好。可否再传一遍给我,我没有收到, 不清 ...
s2sh整合
最近自己写了一个数据库连接池,本来想用dpcp、c3p0数据库连接池,但是产品用的是oracle的数据仓库,给的驱动是jdbc驱动,但不是数据库连接驱动,不用以上连接池,自己写了一个,请大家看一下有问题没?
public class ConnectionPool implements ConPool{
/**
* 数据库连接池配置参数
*/
private ConConfig conConfig;
/**
* 数据库连接池
*/
private Stack<Connection> poolStack;
/**
* 活动连接数
*/
private int numActive = 0;
/**
* 数据库连接闲置数
*/
private int numIdle = 0;
public ConnectionPool(ConConfig conConfig){
this.conConfig = conConfig;
poolStack = new Stack<Connection>();
addConnection(conConfig.getInitConSize());
}
/**
* 数据库连接池添加连接
* @param count
*/
protected synchronized void addConnection(int count){
for (int i = 0; i < count; i++) {
Connection con;
try {
con = createConnection();
poolStack.push(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 创建连接Connection
* @param conConfig
* @return
* @throws Exception
*/
protected Connection createConnection() throws Exception{
String driver = conConfig.getConDriver();
String url = conConfig.getConUrl();
String userName = conConfig.getUserName();
String passWord = conConfig.getPassWord();
Class.forName(driver).newInstance();
Connection conn = DriverManager.getConnection(url, userName, passWord);
return conn;
}
/**
* 从数据库连接池中获取连接
*/
public synchronized Connection borrowConnection() throws Exception{
Connection con = null;
while(con == null){
if(!poolStack.isEmpty()){
con = poolStack.pop();
}else{
con = findConnection();
}
}
numActive++;
return con;
}
/**
* 获取可用连接
* @return
* @throws Exception
*/
public synchronized Connection findConnection() throws Exception{
Connection con = null;
if(poolStack.size() < conConfig.getMaxConSize()){
con = createConnection();
}else{
waitTime(conConfig.getMaxWaitTime());
if(poolStack.isEmpty())
throw new IllegalStateException("等待连接超时");
else
con = poolStack.pop();
if(con.isClosed())
throw new IllegalStateException("获取的连接已经关闭");
}
return con;
}
/**
* 关闭连接
*/
public void closeConnection(Connection con) {
try {
if(!con.isClosed()){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 销毁连接
* @param con
*/
public synchronized void destroyedCon(Connection con){
closeConnection(con);
con = null;
}
/**
* 清空连接池
*/
public synchronized void clear() {
Iterator it = poolStack.iterator();
while(it.hasNext()) {
try {
Connection con =(Connection)it.next();
destroyedCon(con);
} catch(Exception e) {
}
}
poolStack.clear();
}
/**
* 将连接返回到连接池中
*/
public void returnConnection(Connection con) throws Exception{
boolean isClose = con.isClosed();
if(isClose){
destroyedCon(con);
return;
}
if(conConfig.getMaxConSize() <= poolStack.size()){
Connection bicon =poolStack.remove(0);
destroyedCon(bicon);
}else{
poolStack.push(con);
numActive--;
}
}
/**
* 超时等待时间
* @param time
*/
protected void waitTime(long time){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public ConConfig getConConfig() {
return conConfig;
}
public void setConConfig(ConConfig conConfig) {
this.conConfig = conConfig;
}
public Stack<Connection> getPoolStack() {
return poolStack;
}
public void setPoolStack(Stack<Connection> poolStack) {
this.poolStack = poolStack;
}
public int getNumActive() {
return numActive;
}
public void setNumActive(int numActive) {
this.numActive = numActive;
}
public int getNumIdle() {
return poolStack.size();
}
public void setNumIdle(int numIdle) {
this.numIdle = numIdle;
}
}
public class ConConfig {
public String conDriver;
public String conUrl;
public String userName;
public String passWord;
public int minConSize;
public int maxConSize;
public int acquireIncrement;
public int initConSize;
public int maxWaitTime;
public String getConDriver() {
return conDriver;
}
public void setConDriver(String conDriver) {
this.conDriver = conDriver;
}
public String getConUrl() {
return conUrl;
}
public void setConUrl(String conUrl) {
this.conUrl = conUrl;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public int getMinConSize() {
return minConSize;
}
public void setMinConSize(int minConSize) {
this.minConSize = minConSize;
}
public int getMaxConSize() {
return maxConSize;
}
public void setMaxConSize(int maxConSize) {
this.maxConSize = maxConSize;
}
public int getAcquireIncrement() {
return acquireIncrement;
}
public void setAcquireIncrement(int acquireIncrement) {
this.acquireIncrement = acquireIncrement;
}
public int getInitConSize() {
return initConSize;
}
public void setInitConSize(int initConSize) {
this.initConSize = initConSize;
}
public int getMaxWaitTime() {
return maxWaitTime;
}
public void setMaxWaitTime(int maxWaitTime) {
this.maxWaitTime = maxWaitTime;
}
}
public class ConPoolFactory {
private static ConnectionPool conPool = null;
private static boolean flag = false;
private static ConConfig config = null;
static{
if(!flag){
config = new ConConfig();
config.userName = SSConfig.getInstance().getProperty("biee.conUser"); //用户名
config.passWord = SSConfig.getInstance().getProperty("biee.conPwd"); //密码
config.conDriver= SSConfig.getInstance().getProperty("biee.conDriver");//连接驱动
config.conUrl= SSConfig.getInstance().getProperty("biee.conUrl");//连接URL
config.initConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.initialSize")); //初始化连接数
config.acquireIncrement = Integer.valueOf(SSConfig.getInstance().getProperty("biee.acquireIncrement")); //初始化连接递增数
config.maxConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxConSize")); //最大激活连接数
config.minConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.minConSize")); //最小连接数,就这个有用.
config.maxWaitTime= Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxWait"));//获得连接的最大等待毫秒数
conPool = new ConnectionPool(config);
flag = true;
}
}
public ConnectionPool getInstancePool(){
if(conPool == null){
conPool = new ConnectionPool(config);
}
return conPool;
}
}
public class ConnectionPool implements ConPool{
/**
* 数据库连接池配置参数
*/
private ConConfig conConfig;
/**
* 数据库连接池
*/
private Stack<Connection> poolStack;
/**
* 活动连接数
*/
private int numActive = 0;
/**
* 数据库连接闲置数
*/
private int numIdle = 0;
public ConnectionPool(ConConfig conConfig){
this.conConfig = conConfig;
poolStack = new Stack<Connection>();
addConnection(conConfig.getInitConSize());
}
/**
* 数据库连接池添加连接
* @param count
*/
protected synchronized void addConnection(int count){
for (int i = 0; i < count; i++) {
Connection con;
try {
con = createConnection();
poolStack.push(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 创建连接Connection
* @param conConfig
* @return
* @throws Exception
*/
protected Connection createConnection() throws Exception{
String driver = conConfig.getConDriver();
String url = conConfig.getConUrl();
String userName = conConfig.getUserName();
String passWord = conConfig.getPassWord();
Class.forName(driver).newInstance();
Connection conn = DriverManager.getConnection(url, userName, passWord);
return conn;
}
/**
* 从数据库连接池中获取连接
*/
public synchronized Connection borrowConnection() throws Exception{
Connection con = null;
while(con == null){
if(!poolStack.isEmpty()){
con = poolStack.pop();
}else{
con = findConnection();
}
}
numActive++;
return con;
}
/**
* 获取可用连接
* @return
* @throws Exception
*/
public synchronized Connection findConnection() throws Exception{
Connection con = null;
if(poolStack.size() < conConfig.getMaxConSize()){
con = createConnection();
}else{
waitTime(conConfig.getMaxWaitTime());
if(poolStack.isEmpty())
throw new IllegalStateException("等待连接超时");
else
con = poolStack.pop();
if(con.isClosed())
throw new IllegalStateException("获取的连接已经关闭");
}
return con;
}
/**
* 关闭连接
*/
public void closeConnection(Connection con) {
try {
if(!con.isClosed()){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 销毁连接
* @param con
*/
public synchronized void destroyedCon(Connection con){
closeConnection(con);
con = null;
}
/**
* 清空连接池
*/
public synchronized void clear() {
Iterator it = poolStack.iterator();
while(it.hasNext()) {
try {
Connection con =(Connection)it.next();
destroyedCon(con);
} catch(Exception e) {
}
}
poolStack.clear();
}
/**
* 将连接返回到连接池中
*/
public void returnConnection(Connection con) throws Exception{
boolean isClose = con.isClosed();
if(isClose){
destroyedCon(con);
return;
}
if(conConfig.getMaxConSize() <= poolStack.size()){
Connection bicon =poolStack.remove(0);
destroyedCon(bicon);
}else{
poolStack.push(con);
numActive--;
}
}
/**
* 超时等待时间
* @param time
*/
protected void waitTime(long time){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public ConConfig getConConfig() {
return conConfig;
}
public void setConConfig(ConConfig conConfig) {
this.conConfig = conConfig;
}
public Stack<Connection> getPoolStack() {
return poolStack;
}
public void setPoolStack(Stack<Connection> poolStack) {
this.poolStack = poolStack;
}
public int getNumActive() {
return numActive;
}
public void setNumActive(int numActive) {
this.numActive = numActive;
}
public int getNumIdle() {
return poolStack.size();
}
public void setNumIdle(int numIdle) {
this.numIdle = numIdle;
}
}
public class ConConfig {
public String conDriver;
public String conUrl;
public String userName;
public String passWord;
public int minConSize;
public int maxConSize;
public int acquireIncrement;
public int initConSize;
public int maxWaitTime;
public String getConDriver() {
return conDriver;
}
public void setConDriver(String conDriver) {
this.conDriver = conDriver;
}
public String getConUrl() {
return conUrl;
}
public void setConUrl(String conUrl) {
this.conUrl = conUrl;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public int getMinConSize() {
return minConSize;
}
public void setMinConSize(int minConSize) {
this.minConSize = minConSize;
}
public int getMaxConSize() {
return maxConSize;
}
public void setMaxConSize(int maxConSize) {
this.maxConSize = maxConSize;
}
public int getAcquireIncrement() {
return acquireIncrement;
}
public void setAcquireIncrement(int acquireIncrement) {
this.acquireIncrement = acquireIncrement;
}
public int getInitConSize() {
return initConSize;
}
public void setInitConSize(int initConSize) {
this.initConSize = initConSize;
}
public int getMaxWaitTime() {
return maxWaitTime;
}
public void setMaxWaitTime(int maxWaitTime) {
this.maxWaitTime = maxWaitTime;
}
}
public class ConPoolFactory {
private static ConnectionPool conPool = null;
private static boolean flag = false;
private static ConConfig config = null;
static{
if(!flag){
config = new ConConfig();
config.userName = SSConfig.getInstance().getProperty("biee.conUser"); //用户名
config.passWord = SSConfig.getInstance().getProperty("biee.conPwd"); //密码
config.conDriver= SSConfig.getInstance().getProperty("biee.conDriver");//连接驱动
config.conUrl= SSConfig.getInstance().getProperty("biee.conUrl");//连接URL
config.initConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.initialSize")); //初始化连接数
config.acquireIncrement = Integer.valueOf(SSConfig.getInstance().getProperty("biee.acquireIncrement")); //初始化连接递增数
config.maxConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxConSize")); //最大激活连接数
config.minConSize = Integer.valueOf(SSConfig.getInstance().getProperty("biee.minConSize")); //最小连接数,就这个有用.
config.maxWaitTime= Integer.valueOf(SSConfig.getInstance().getProperty("biee.maxWait"));//获得连接的最大等待毫秒数
conPool = new ConnectionPool(config);
flag = true;
}
}
public ConnectionPool getInstancePool(){
if(conPool == null){
conPool = new ConnectionPool(config);
}
return conPool;
}
}
发表评论
-
SQL总结存储过程
2017-02-16 10:13 394概念 存储过程(Stored Procedure):已预编译 ... -
oracle设置定时任务job调度执行存储过程或pl/sql代码块
2017-02-16 09:53 439目前oracle数据库设置定时任务job调度一般有两种方式,分 ... -
sql大全
2013-07-12 19:02 1038经典SQL语句大全 一、基础 1、说明: ... -
Linux安装mysql——源码安装
2013-06-05 09:17 7921.假设已经有mysql-5.5.10.tar.gz以及cma ... -
hql语句集合
2013-04-21 19:13 1081/** * */ package com.b510 ... -
oracle命令导入dmp文件与给用户受权
2012-05-03 15:57 1019创建账号:CREATE USER vdrs IDENTIFIE ... -
oracle对日期进行操作
2012-03-19 15:41 1253一下心血来潮,把部分Oracle对时间的一些处理,整理了一下, ... -
如何查出同一张表中字段值重复的记录
2012-03-17 09:45 1601比如现在有一人员表(表名:peosons) 若想将姓名、身份证 ... -
数据库驱动大全
2011-12-26 09:47 933经常因为链接字符串记不住或者记错的原因浪费时间,终于有时间把常 ... -
用JSP导出ORACLE的数据表DDL
2011-12-08 10:47 1116EXPDDL.JSP <%@ page cont ... -
jsp脚本实现本分数据库
2011-12-08 10:44 901JSP导出Oracle数据表是一个在开发应用时的常用的操作,那 ... -
oracle创建id自增及相关增删改查操作
2011-11-21 16:46 992新建下载权限记录表 DOWNLOADPOPE_TAB ... -
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connec
2011-10-28 15:43 1282WARN: SettingsFactory,103 - Cou ... -
oracle安装及使用
2011-10-16 23:50 925安装后数据库 1.使用plsql打开,一般选项 口 ... -
递归数
2011-10-10 17:30 1118有的情况下,我们需要用递归的方法整理数据,这才程序中很容易 ... -
mysql中递归树状结构
2011-10-10 17:20 11388在Oracle 中我们知道有一个 Hierarchic ... -
级联删除和级联修改
2011-06-22 14:08 2817曾经因为级联删除的问题浪费了N多时间,顾此在这里写下小小心得, ... -
mysql解决乱码问题?
2011-06-15 14:33 832mysql数据库,乱码解决 ... -
MySql
2011-06-14 16:12 8521.安装之后 2.创建数据库 s2sh(库名) creat ... -
数据库死锁的解释?以及什么是死锁
2011-04-25 10:41 858什么是数据库死锁 每个使用关系型数据库的程序都可能 ...
相关推荐
简单的利用java装饰模式自定义实现了连接池简单实例。
在这个场景中,我们将动态代理应用于自定义连接池的实现,来提高数据库访问的效率和资源管理。 首先,让我们深入理解动态代理。Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect....
今天我们将探讨的是"自定义连接池"这一主题,这涉及到对数据库连接管理的深入理解和源码级别的实现。 在Java开发中,常见的连接池工具有C3P0、DBCP、HikariCP以及Apache的D殷库连接池(Druid)。这些连接池已经足够...
自己写的连接池如果想知道连接池是怎么实现的就动手下载吧!
自定义连接池可以帮助我们更好地控制连接的生命周期,定制化配置,比如最大连接数、最小连接数、超时时间等。通过连接池,程序可以复用已建立的数据库连接,提高系统效率,减少资源消耗。 单例模式是一种设计模式,...
然而,自定义连接池往往需要处理很多细节问题,如线程安全、连接超时、公平性策略等,对于新手来说具有一定的挑战性。因此,实践中更常见的是使用成熟的开源连接池实现,如以下几种: 1. C3P0:这是一个开源的JDBC...
自定义连接池需要考虑如何实现这些功能,例如使用`java.sql.Connection`接口和`java.sql.DataSource`接口来管理数据库连接。 8. **资源分配策略**:连接池需要有一套智能的分配策略,如基于优先级、公平性或轮询的...
实现自定义连接池的关键步骤如下: 1. **初始化连接池**:定义连接池的最大连接数、初始连接数等参数,并根据这些参数创建初始的连接。 2. **提供获取连接的方法**:实现一个方法,用于线程获取连接。如果连接池中...
JDBC自定义连接池过程详解 JDBC自定义连接池过程详解是Java数据库连接池技术的核心内容之一。本文将详细介绍JDBC自定义连接池过程详解的原理、实现和应用。 一、概述 在Java数据库编程中,获得连接和释放资源是...
本案例将介绍三种常见的数据库连接池实现:C3P0、Druid以及自定义连接池的实现。 首先,C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特性包括连接测试、...
此外,自定义连接池还需要考虑线程安全、连接超时、最大连接数限制等关键问题。这样的工具类通常包含初始化连接池、获取连接、释放连接以及关闭连接池等方法。 其次,新版本ActiveMQ自带的连接池服务,也称为...
Unidac提供了API和事件,允许自定义连接池的行为,以适应不同场景的需求。 此外,Unidac还支持多线程环境下的连接池管理,确保在并发环境中每个线程都能安全地获取和释放连接。这通过内部的锁机制和线程同步来实现...
总结一下,本示例展示了如何在JSP中使用自定义连接池类(如"ConnectionPool.java")进行数据库连接,以及如何在"verifylogin.jsp"和"Login1.jsp"中调用连接池执行数据库操作。理解并正确使用数据库连接池是提高Web...
数据库连接池在Java中的实现是...通过自定义连接池,我们可以控制连接的生命周期,优化资源使用,从而提高应用的性能和稳定性。在实际项目中,结合已有的成熟连接池框架,我们可以构建更加高效和可靠的数据库访问层。
自定义连接池是指通过实现 javax.sql.DataSource 接口来创建一个连接池。这个接口提供了获取连接的方法,例如 getConnection()。在自定义连接池中,可以使用 List 集合来存储多个连接对象。在程序开始时,可以初始化...
这种自定义连接池对于小型项目来说,可能是一个轻量级且有效的解决方案。 数据库连接池的基本原理是预先创建并维护一定数量的数据库连接,应用程序在需要时可以从池中获取连接,用完后归还而不是直接关闭,从而避免...
通过自定义连接池,开发者可以更直观地理解连接池的工作原理,这对深入学习数据库编程和系统优化具有积极的意义。对于初学者而言,这是一个很好的实践项目,可以帮助他们巩固基础,为未来处理更复杂的数据库应用场景...
自定义连接池的核心在于设计一个容器(通常为集合)来存储Connection对象。例如,在提供的代码示例中,使用了LinkedList来存储连接。连接池的初始化会预先创建一定数量的连接并存入列表,当需要执行数据库操作时,...