写了一个简单的数据库连接池,自已没发现什么问题,不知道行不行上,大家给看一下

时间:2022-12-11 15:28:39
package com.tisv;

import java.sql.*;

/**
 *
 * @author ch
 */
public class dbset {
    public static int ljd=100;//最多数据库连接数
    public static int ljyj=0;//已创建的连接数
    public static int ljbj=5;//数据库连接数增加步进
    public static int ljky=0;//当前可用的连接数
    public static int ljyy=0;//当前已用的连接数
    public static Connection[] Con=new Connection[ljd];//保存数据库连接的数组
    public static int[] conState=new int[ljd]; //保存可用数据库连接的对列
    public static int[] conHour=new int[ljd];//保存使用数据库连接的小时数
    public static int lj=0;//可用的数据库连接位置
    public static boolean ljjk=false;//数据库连接监控是否启动
    
    //测试用
    public static int aa=-1;
}


package com.tisv;

import java.sql.*;
import java.util.*;

/**
 *
 * @author ch
 */
public class dbcon {
    
    /** Creates a new instance of dbcon */
    //数据库连接
    public Connection Connect() {
        Connection conn=null;
        try{                
           Class.forName("org.postgresql.Driver").newInstance();
           String url="jdbc:postgresql://localhost/tisv";
           String user="tisv";
           String password="ch";
           conn=DriverManager.getConnection(url,user,password);
        }
        catch(Exception fe){            
        }        
        return conn;   
    }
    //填充数据库连接数组
    public  void addCon(int xjlj) {   
        for(int i=0;i<xjlj;i++){
            Connection cona=Connect();
            if(cona!=null){
                dbset.Con[dbset.ljyj]=cona;
                dbset.conState[dbset.ljyj]=dbset.ljyj;
                dbset.ljyj++;
                dbset.ljky++;
            }
        }
    }
   
    //得到数据库连接
    public synchronized int getCon(){        
        //如果可用连接数小于连接增加步进数,新增加连接
        if(dbset.ljky<dbset.ljbj){
            int xjs=dbset.ljd-dbset.ljyj;
            if(xjs>dbset.ljbj){
                addCon(dbset.ljbj);
            }
            else{
                addCon(xjs);
            }
        }
        if(dbset.ljjk==false){
            new timeCon().start();
        }
        int fh;//返回可用连接的在数组中的位置
        if(dbset.lj<0||dbset.lj>=dbset.ljyj){
            fh=-1;//如果当前连接位置小于0或大于已建连接数,返回空值
        }
        else{     
            fh=dbset.conState[dbset.lj];
            dbset.conState[dbset.lj]=-1;
            Calendar rightNow=Calendar.getInstance();
            dbset.conHour[dbset.lj]=rightNow.get(Calendar.HOUR_OF_DAY);            
            dbset.lj++;
            dbset.ljky--;
            dbset.ljyy++;
        }
        return fh;
    }
    //释放数据库连接
    public synchronized void freeCon(int i){
        dbset.lj--;
        dbset.conState[dbset.lj]=i;
        dbset.ljky++;
        dbset.ljyy--;
    }
}


使用:


dbcon cons=new dbcon();
            int coni=cons.getCon();
            if(coni<0){
                ts+="<br>没有可用的数据库连接";
            }
            else{
                Statement stmt;
                ResultSet rs;
               
                try{
                    stmt=dbset.Con[coni].createStatement();
                    rs=stmt.executeQuery(strSql);
                }
            }

cons.freeCon(coni);

14 个解决方案

#1


package com.tisv;

import java.util.*;
import java.sql.*;
/**
 *
 * @author ch
 */
//计算数据库连接时间,超时断开
public class timeCon extends Thread {    
    @Override
    public void run(){
        dbset.ljjk=true;
        while(true){
            try{
                Thread.sleep(72000000);
            }
            catch(Exception e){   
                dbset.ljjk=false;
            }   
            Calendar rightNow=Calendar.getInstance();
            int hours=rightNow.get(Calendar.HOUR_OF_DAY);//当前时间
            int sjc=0;//时间差
            for(int i=0;i<dbset.ljyy;i++){
                sjc=dbset.conHour[dbset.conState[i]]-hours;
                if(sjc>1||sjc<1){    
                    try{
                        dbset.Con[dbset.conState[i]].close();
                    }
                    catch(Exception e){                        
                    }
                    dbcon cons=new dbcon();
                    dbset.Con[dbset.conState[i]]=cons.Connect();
                }
            }
        }
    }
}

#2


有些欠缺,如果程序员在调用的时候调用了Connection的close方法(这是每个程序员的习惯),那么你的连接池就回收不了连接了,那你的连接池就没什么意义啦

lz再想一想o(∩_∩)o...

#3


你这个东西使用起来很不方便

#4


引用 2 楼 kokobox 的回复:
有些欠缺,如果程序员在调用的时候调用了Connection的close方法(这是每个程序员的习惯),那么你的连接池就回收不了连接了,那你的连接池就没什么意义啦

lz再想一想o(∩_∩)o...

我觉得没什么问题,即连接被不小心关闭了,那与这个连接对应的数组中的那个值就不会被重新放入可能连接数组中,那在两小时内,这个已被关闭的连接会被重新建立
我做了个线程是做这个的

#5


如果是直接关闭了 那还要这个池干什么

连接池工厂返回的连接对象应该是自己实现连接接口的一个对象,这个对象已经覆盖了close()方法,用装饰模式自己实现一个Connection接口比较好

#6


o(∩_∩)o... lz可以到网上找一下,为什么要有连接池,连接池的意义和作用是什么?

如果每次程序员都用完了都调用close方法,把连接池彻底关闭,再用再到你的池里取,取里发现少了再创建,和现用现创建有区别吗?

#7


我倒没想过其他人会怎么用,因为写这个连接池是我自已用的,只要没有问题就可以了

#8


引用 7 楼 linzhifeng 的回复:
我倒没想过其他人会怎么用,因为写这个连接池是我自已用的,只要没有问题就可以了


LZ是自娱自乐哈

#9


因为写这个连接池是我自已用的

这个不能成为借口。 因为你的程序不是你用,而是你的客户用,你应该对他们负责。

呵呵,有点远了。

楼上几位的建议,基本都是你为何不重写 .close()方法。 你的程序getConnection之后,从来不close() 吗?

#10


dbcon cons=new dbcon(); 
            int coni=cons.getCon(); 
            if(coni <0){ 
                ts+=" <br>没有可用的数据库连接"; 
            } 
            else{ 
                Statement stmt; 
                ResultSet rs; 
                
                try{ 
                    stmt=dbset.Con[coni].createStatement(); 
                    rs=stmt.executeQuery(strSql); 
                } 
            } 

#11


引用 9 楼 java2000_net 的回复:
因为写这个连接池是我自已用的 

这个不能成为借口。 因为你的程序不是你用,而是你的客户用,你应该对他们负责。 

呵呵,有点远了。 

楼上几位的建议,基本都是你为何不重写 .close()方法。 你的程序getConnection之后,从来不close() 吗? 

这个连接池,我是用这个代替close()的
cons.freeCon(coni);

#12


不错拉
至少也是个对象池

#13


别人要是用你的连接池的话,可能不是那么方便。不过,感觉这个连接池写的还是不错,最大的问题也是CLOSE()方法,如果是一个应用比较大的系统,你的连接池资源很快就会被耗尽了。耗尽以后再重新创建,这就不能发挥连接池的作用了。

#14


有现存的为何不用?现在的WEB容器都自带这个了。

#1


package com.tisv;

import java.util.*;
import java.sql.*;
/**
 *
 * @author ch
 */
//计算数据库连接时间,超时断开
public class timeCon extends Thread {    
    @Override
    public void run(){
        dbset.ljjk=true;
        while(true){
            try{
                Thread.sleep(72000000);
            }
            catch(Exception e){   
                dbset.ljjk=false;
            }   
            Calendar rightNow=Calendar.getInstance();
            int hours=rightNow.get(Calendar.HOUR_OF_DAY);//当前时间
            int sjc=0;//时间差
            for(int i=0;i<dbset.ljyy;i++){
                sjc=dbset.conHour[dbset.conState[i]]-hours;
                if(sjc>1||sjc<1){    
                    try{
                        dbset.Con[dbset.conState[i]].close();
                    }
                    catch(Exception e){                        
                    }
                    dbcon cons=new dbcon();
                    dbset.Con[dbset.conState[i]]=cons.Connect();
                }
            }
        }
    }
}

#2


有些欠缺,如果程序员在调用的时候调用了Connection的close方法(这是每个程序员的习惯),那么你的连接池就回收不了连接了,那你的连接池就没什么意义啦

lz再想一想o(∩_∩)o...

#3


你这个东西使用起来很不方便

#4


引用 2 楼 kokobox 的回复:
有些欠缺,如果程序员在调用的时候调用了Connection的close方法(这是每个程序员的习惯),那么你的连接池就回收不了连接了,那你的连接池就没什么意义啦

lz再想一想o(∩_∩)o...

我觉得没什么问题,即连接被不小心关闭了,那与这个连接对应的数组中的那个值就不会被重新放入可能连接数组中,那在两小时内,这个已被关闭的连接会被重新建立
我做了个线程是做这个的

#5


如果是直接关闭了 那还要这个池干什么

连接池工厂返回的连接对象应该是自己实现连接接口的一个对象,这个对象已经覆盖了close()方法,用装饰模式自己实现一个Connection接口比较好

#6


o(∩_∩)o... lz可以到网上找一下,为什么要有连接池,连接池的意义和作用是什么?

如果每次程序员都用完了都调用close方法,把连接池彻底关闭,再用再到你的池里取,取里发现少了再创建,和现用现创建有区别吗?

#7


我倒没想过其他人会怎么用,因为写这个连接池是我自已用的,只要没有问题就可以了

#8


引用 7 楼 linzhifeng 的回复:
我倒没想过其他人会怎么用,因为写这个连接池是我自已用的,只要没有问题就可以了


LZ是自娱自乐哈

#9


因为写这个连接池是我自已用的

这个不能成为借口。 因为你的程序不是你用,而是你的客户用,你应该对他们负责。

呵呵,有点远了。

楼上几位的建议,基本都是你为何不重写 .close()方法。 你的程序getConnection之后,从来不close() 吗?

#10


dbcon cons=new dbcon(); 
            int coni=cons.getCon(); 
            if(coni <0){ 
                ts+=" <br>没有可用的数据库连接"; 
            } 
            else{ 
                Statement stmt; 
                ResultSet rs; 
                
                try{ 
                    stmt=dbset.Con[coni].createStatement(); 
                    rs=stmt.executeQuery(strSql); 
                } 
            } 

#11


引用 9 楼 java2000_net 的回复:
因为写这个连接池是我自已用的 

这个不能成为借口。 因为你的程序不是你用,而是你的客户用,你应该对他们负责。 

呵呵,有点远了。 

楼上几位的建议,基本都是你为何不重写 .close()方法。 你的程序getConnection之后,从来不close() 吗? 

这个连接池,我是用这个代替close()的
cons.freeCon(coni);

#12


不错拉
至少也是个对象池

#13


别人要是用你的连接池的话,可能不是那么方便。不过,感觉这个连接池写的还是不错,最大的问题也是CLOSE()方法,如果是一个应用比较大的系统,你的连接池资源很快就会被耗尽了。耗尽以后再重新创建,这就不能发挥连接池的作用了。

#14


有现存的为何不用?现在的WEB容器都自带这个了。