java自定义数据库连接池.docx

上传人:b****5 文档编号:7391160 上传时间:2023-01-23 格式:DOCX 页数:17 大小:18.98KB
下载 相关 举报
java自定义数据库连接池.docx_第1页
第1页 / 共17页
java自定义数据库连接池.docx_第2页
第2页 / 共17页
java自定义数据库连接池.docx_第3页
第3页 / 共17页
java自定义数据库连接池.docx_第4页
第4页 / 共17页
java自定义数据库连接池.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

java自定义数据库连接池.docx

《java自定义数据库连接池.docx》由会员分享,可在线阅读,更多相关《java自定义数据库连接池.docx(17页珍藏版)》请在冰豆网上搜索。

java自定义数据库连接池.docx

java自定义数据库连接池

java:

自定义数据库连接池

连接池是非常好的想法,应用很普遍。

自己写一个数据库连接池,并不像想象中那样困难。

一般系统对连接池的功能不会有太多要求,使用自己的连接池未必是个坏主意。

下面以Oracle为例,但是对Teradata和Greenplum也是可行的。

另外我还实现了连接有效性检查(checkConn)和恢复连接(resetConn)的方法。

本例编程采用的是JRE1.4.2环境(别忘了准备访问数据库的jar包)。

有任何问题请随时留言,欢迎探讨。

在Oracle内创建测试数据:

droptablemy_table;

createtablemy_table(

field_idvarchar2(3),

field_contentvarchar2(60),

record_create_datedatedefaultsysdate

);

insertintomy_table(field_id,field_content)values('001','thisisfirstrecord');

insertintomy_table(field_id,field_content)values('002','thisissecondrecord');

insertintomy_table(field_id,field_content)values('003','thisisthirdrecord');

commit;

DBPool.java:

packagedataWebService;

importjava.sql.DriverManager;

importjava.util.Date;

importjava.sql.Connection;

importjava.sql.SQLException;

importjava.sql.Statement;

publicclassDBPool{

privateStringcls;

privateStringurl;

privateStringusr;

privateStringpss;

privateintconnCount=3;//连接数

privateConnection[]connections;//保存数据库连接

privateString[]connStatus;//已连可用Y已连不可用N未连接X

privateDate[]lastQueryTime;//时间戳

publicDBPool(DBPoolConfigurationpoolConfiguration){

this.connCount=poolConfiguration.getConnCount();

this.cls=poolConfiguration.getCls();

this.url=poolConfiguration.getUrl();

this.usr=poolConfiguration.getUsr();

this.pss=poolConfiguration.getPss();

this.connections=newConnection[this.connCount];

this.connStatus=newString[this.connCount];

for(inti=0;i

this.connStatus[i]="X";//初始化全部未连接

}

this.lastQueryTime=newDate[this.connCount];

}

publicDBPool(Stringcls,Stringurl,Stringusr,Stringpss){

this.cls=cls;

this.url=url;

this.usr=usr;

this.pss=pss;

this.connections=newConnection[this.connCount];

this.connStatus=newString[this.connCount];

for(inti=0;i

this.connStatus[i]="X";//初始化全部未连接

}

this.lastQueryTime=newDate[this.connCount];

}

publicvoidinitPool(){

if(connCount<1){

System.out.println("请正确设置连接池窗口个数");

}else{

try{

Class.forName(this.cls);//registerclass

}catch(ClassNotFoundExceptione){

System.out.println(e.getMessage());

}catch(Exceptione){

System.out.println(e.getMessage());//otherexceptions

}

for(inti=0;i

try{

this.connections[i]=DriverManager.getConnection(this.url,this.usr,this.pss);

this.connStatus[i]="Y";

}catch(SQLExceptione){

System.out.println(e.getMessage());

}catch(Exceptione){

System.out.println(e.getMessage());//otherexceptions

}

}

System.out.println("initPoolisready...");

}//endif

}

publicvoidfreePool(){

for(inti=0;i

try{

this.connections[i].commit();

this.connections[i].close();

this.connStatus[i]="X";

this.lastQueryTime[i]=null;

}catch(Exceptione){

try{

this.connections[i].close();

this.connStatus[i]="X";

this.lastQueryTime[i]=null;

}catch(Exceptione1){

System.out.println(e1.getMessage());//justforcatch

}

}

}

System.out.println("freePoolisover...");

}

publicDBPoolConnectiongetPoolConn()throwsDBPoolIsFullException{

DBPoolConnectionpoolConnection=newDBPoolConnection();

poolConnection.connNbr=getConnNbr();

if(poolConnection.connNbr==-1){

thrownewDBPoolIsFullException("连接池已满");

}else{

poolConnection.conn=getConn(poolConnection.connNbr);

}

returnpoolConnection;

}

publicvoidfreePoolConn(DBPoolConnectionpoolConnection){

if(poolConnection==null){

System.out.println("poolConnection==null,不需要释放");

}else{

freeConn(poolConnection.connNbr);

}

}

publicvoidprintPoolStatus(){

for(inti=0;i

System.out.println("");

System.out.print(this.connStatus[i].toString());

if(this.lastQueryTime[i]==null){

System.out.print("-[null]");

}else{

System.out.print("-["+this.lastQueryTime[i].toString()+"]");

}

}

System.out.println("");

}

publicStringgetCls(){

returnthis.cls;

}

publicStringgetUrl(){

returnthis.url;

}

publicStringgetUsr(){

returnthis.usr;

}

intgetConnNbr(){

intiConn=-1;

for(inti=0;i

if(this.connStatus[i].equals("Y")){

this.lastQueryTime[i]=newDate();

this.connStatus[i]="N";

iConn=i;

break;

}

}

returniConn;

}

ConnectiongetConn(inti){

returnthis.connections[i];

}

voidcloseConnForTest(DBPoolConnectionpoolConnection){

try{

this.connections[poolConnection.connNbr].close();

}catch(SQLExceptione){

System.out.println(e.getMessage());

}

}

booleancheckConn(DBPoolConnectionpoolConnection){

Statementstmt=null;

StringcheckMessage="";

booleancheckResult=true;

//检查连接是否有效

try{

Stringsql="select*fromdual";

stmt=this.connections[poolConnection.connNbr].createStatement();

stmt.executeQuery(sql);//executesql

stmt.close();

checkMessage="checkConn:

checkMessage:

executesqlsuccess";

System.out.println(checkMessage);

}catch(Exceptione){

checkMessage=e.getMessage();

System.out.println(e.getMessage());//otherexceptions

if(checkMessage==null){

checkMessage="e.getMessage()isnull";

System.out.println(checkMessage);

}

//采取激进重连的策略,尽量避免业务中断

if(checkMessage.indexOf("ORA-00942")>=0){

checkResult=true;//不需要重连

}elseif(checkMessage.indexOf("doesnotexist")>=0){

checkResult=true;//不需要重连

}elseif(checkMessage.indexOf("Syntaxerror")>=0){

checkResult=true;//不需要重连

}else{

checkResult=false;//需要重连

}

}

returncheckResult;

}

booleanresetConn(DBPoolConnectionpoolConnection){

booleanresult=false;//默认不需要重建连接

if(poolConnection==null){

System.out.println("poolConnection==null,不知道您想重设哪个连接");

}elseif(poolConnection.connNbr==-1){

System.out.println("poolConnection.connNbr==-1,不知道您想重设哪个连接");

}else{

if(checkConn(poolConnection)==true){

System.out.println("连接有效,不需要重设");

}else{

//重设连接

try{

Class.forName(this.cls);//registerclass

}catch(ClassNotFoundExceptione){

System.out.println(e.getMessage());

}catch(Exceptione){

System.out.println(e.getMessage());//otherexceptions

}

try{

this.connections[poolConnection.connNbr]=DriverManager.getConnection(this.url,this.usr,this.pss);

this.connStatus[poolConnection.connNbr]="Y";

System.out.println(poolConnection.connNbr+"连接已重建");

result=true;//告知调用者连接已重建

}catch(SQLExceptione){

System.out.println(e.getMessage());

}catch(Exceptione){

System.out.println(e.getMessage());//otherexceptions

}

}

}

returnresult;

}

voidfreeConn(inti){

try{

if(i==-1){

System.out.println("i=-1,不需要释放");

}else{

this.connections[i].commit();

}

}catch(SQLExceptione){

System.out.println(e.getMessage());

}catch(Exceptione){

System.out.println(e.getMessage());//otherexceptions

}

this.connStatus[i]="Y";

}

}

DBPoolConfiguration.java

packagedataWebService;

publicclassDBPoolConfiguration{

privateStringcls;

privateStringurl;

privateStringusr;

privateStringpss;

privateintconnCount;//连接数

publicStringgetCls(){

returncls;

}

publicvoidsetCls(Stringcls){

this.cls=cls;

}

publicStringgetUrl(){

returnurl;

}

publicvoidsetUrl(Stringurl){

this.url=url;

}

publicStringgetUsr(){

returnusr;

}

publicvoidsetUsr(Stringusr){

this.usr=usr;

}

publicStringgetPss(){

returnpss;

}

publicvoidsetPss(Stringpss){

this.pss=pss;

}

publicintgetConnCount(){

returnconnCount;

}

publicvoidsetConnCount(intconnCount){

this.connCount=connCount;

}

}

DBPoolConnection.java:

packagedataWebService;

importjava.sql.Connection;

publicclassDBPoolConnection{

publicintconnNbr=-1;

publicConnectionconn=null;

DBPoolConnection(){

this.connNbr=-1;

this.conn=null;

}

}

DBPoolIsFullException.java

packagedataWebService;

publicclassDBPoolIsFullExceptionextendsException{

staticfinallongserialVersionUID=1L;

DBPoolIsFullException(Stringmessage){

super(message);

}

}

Test.java

packagemyAction;

importdataWebService.DBPool;

importdataWebService.DBPoolConnection;

importdataWebService.DBPoolConfiguration;

importjava.sql.ResultSet;

importjava.sql.ResultSetMetaData;

importjava.sql.Statement;

publicclassTest{

staticStringrpad(Stringstr,intlen){

Strings=str;

if(s==null){

s="";

}

while(s.getBytes().length

s+="";

}

returns;

}

publicstaticvoidmain(String[]args){

//初始化

Stringcls="",url="",usr="",pss="",sql="";

Statementstmt=null;

ResultSetrs=null;

StringgapStr="|";//分隔符

intconnCount=2;//最大连接数

//连接Oracle配置

cls="oracle.jdbc.driver.OracleDriver";

url="jdbc:

oracle:

thin:

@localhost:

1521:

myoradb";

usr="abc";

pss="123";

sql="selectt.field_id,t.field_content,to_char(t.record_create_date,'YYYYMMDD')dayfrommy_tablet";

DBPoolConfigurationpoolConfiguration=newDBPoolConfiguration();

poolConfiguration.setCls(cls);

poolConfiguration.setUrl(url);

poolConfiguration.setUsr(usr);

poolConfiguration.setPss(pss);

poolConfiguration.setConnCount(connCount);

DBPoolmyPool=newDBPool(poolConfiguration);

myPool.initPool();

System.out.println("");

System.out.print("afterinitPool");

myPool.printPoolStatus();

System.out.println("");

DBPoolConnectionc1=null;

try{

c1=myPool.getPoolConn();

System.out.println("");

System.out.print("aftergetPoolConn");

myPool.printPoolStatus();

System.out.println("");

stmt=c1.conn.createSta

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1