自己开发了一个数据库连接池,与大家分享,高手指教

只要说一下它的使用,源码给大家
先说说使用:

package org.liufei.test;

import org.liufei.common.DBCP;
import org.liufei.dbcp.connectionFactory.ConnectionFactory;
import org.liufei.dbcp.connectionFactory.DbcpConnection;


public class Test {
public static void main(String[] args) {
DbcpConnection test = ConnectionFactory.getDbcpConnection(DBCP.MICROSOFT);
try {
for(int i = 0 ;i < 20000000; i++){
System.out.println(test.getConnection());
}
test.destroy() ;
} catch (Exception e) {
e.printStackTrace();
}
}
}


极限测试:
mysql上限:7804,超过了会报IO异常。
oracle上限:300,超过了会报打开游标数目过大
SqlServer上限:好像是越多越好,真是韩信用兵,多多益善,我设置了1000000还没有报错,实在不想再等了,呵呵

但是我还是会选择使用oracle。

获取不同的数据库连接池有下面一个枚举类选择:

package org.liufei.common;
/**
* 选择加载的数据库连接池类型
* @author 刘飞
*
*/
public enum DBCP {
MICROSOFT, MYSQL, ORACLE ;
}


连接池接口:

package org.liufei.dao;

import java.io.Serializable;
import java.sql.Connection;


public interface PoolManager extends Serializable {

/**
* connection连接对象池初始化
* @return
* @throws Exception
*/
public boolean initialize() throws Exception ;

/**
* connection连接对象池的销毁
* @throws Exception
*/
public void destroy() throws Exception ;

/**
* 取一个空闲可用的connection连接对象
* @return
* @throws Exception
*/
public Connection getConnection() throws Exception ;

/**
* 把一个connection连接对象从连接对象池中删除
* @throws Exception
*/
public void removeFromPool() throws Exception ;

/**
* 维护connection连接对象池大小
* @throws Exception
*/
public void fillPool() throws Exception ;

/**
* 将一个使用过的活跃连接(connection)返还给连接池。
* @param connection
* @throws Exception
*/
public void close(Connection connection) throws Exception ;

/**
* 定时器事件
* @throws Exception
*/
public void timerEvent() throws Exception ;
}


连接池管理接口:

package org.liufei.dbcp.connectionFactory;

import java.io.Serializable;
import java.sql.Connection;

/**
* 连接池管理接口
* @author 刘飞
*
*/
public interface DbcpConnection extends Serializable {

/**
* 将一个使用过的活跃连接(connection)返还给连接池。
* @param connection
* @throws Exception
*/
public void close(Connection connection) throws Exception ;

/**
* connection连接对象池的销毁
* @throws Exception
*/
public void destroy() throws Exception ;

/**
* 取一个空闲可用的connection连接对象
* @return
* @throws Exception
*/
public Connection getConnection() throws Exception ;

/**
* 检测本地系统上安装的数据库系统,并生成相应的配置文件,
* 如果本地计算机上安装了多个数据库系统,则生成是有相应的配置文件
*/
public void getConfFiles() ;

}

连接池管理接口工厂:

package org.liufei.dbcp.connectionFactory;

import java.io.Serializable;

import org.liufei.common.DBCP;

public class ConnectionFactory implements Serializable{
private static final long serialVersionUID = 102400L;

private ConnectionFactory() {
super();
}

/**
* 获取数据库连接池管理接口
* @return DbcpConnection
*/
public static DbcpConnection getDbcpConnection(DBCP dbcpparam){
return new DbcpConnectionImpl(dbcpparam) ;
}
}


代码如下,供大家下载(有jar和javadoc文档以及属性配置文件):
说明:使用时一定要导入相应的数据库jdbcjar包
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

iteye_13419

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值