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().lengths+="";
}
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