JavaBean数据库连接池

主要由下面三个文件组成:

db.properties


driver=sun.jdbc.odbc.JdbcOdbcDriver
url=Jdbc:Odbc:catalog
username=catalog
password=catalog
size=2
maxsize=4

 

java 代码
  1. package database;   
  2.   
  3.   
  4. import java.io.*;   
  5. import java.sql.*;   
  6. import java.util.*;   
  7.   
  8. //对数据库连接池进行管理与维护   
  9.   
  10. public class ConnectionPool extends Thread   
  11. {   
  12.   //保存缓存的数据库连接对象   
  13.   private ArrayList pool=new ArrayList();   
  14.   
  15.   private String driver;   
  16.   private String url;   
  17.   private String username;   
  18.   private String password;   
  19.   private int size;   
  20.   private int maxsize;   
  21.   
  22.   
  23.   private void initJDBC()   
  24.   {   
  25.     try  
  26.     {   
  27.       //从配置文件中加载数据库驱动程序信息   
  28.       InputStream fin=this.getClass().getResourceAsStream("/db.properties");   
  29.       Properties prop=new Properties();   
  30.       prop.load(fin);   
  31.   
  32.   
  33.       driver=prop.getProperty("driver","sun.jdbc.odbc.JdbcOdbcDriver");   
  34.       url=prop.getProperty("url","jdbc:odbc:catalog");   
  35.       username=prop.getProperty("username","catalog");   
  36.       password=prop.getProperty("password","catalog");   
  37.       size=Integer.parseInt(prop.getProperty("size","2"));   
  38.       maxsize=Integer.parseInt(prop.getProperty("maxsize","4"));   
  39.   
  40.       Class.forName(driver);   
  41.     }   
  42.     catch(Exception e)   
  43.     {   
  44.       e.printStackTrace();   
  45.     }   
  46.   }   
  47.   //初始化数据库连接池   
  48.   private synchronized void initConnectionPool()   
  49.   {   
  50.     try  
  51.     {   
  52.       for(int i=0;i       {   
  53.         Connection con=DriverManager.getConnection(url,username,password);   
  54.         con.setAutoCommit(false);   
  55.         PooledConnection pcon=new PooledConnection(con);   
  56.         pcon.setInuse(false);   
  57.   
  58.   
  59.         pool.add(pcon);   
  60.       }   
  61.     }   
  62.     catch(Exception e)   
  63.     {   
  64.       e.printStackTrace();   
  65.     }   
  66.   }   
  67.   
  68.   //申请数据库连接对象   
  69.   public synchronized Connection applyConnection()   
  70.   {   
  71.     Connection con=null;   
  72.     for(int i=pool.size()-1;i>=0;i--)   
  73.     {   
  74.       PooledConnection pcon=(PooledConnection)pool.get(i);   
  75.       if(!pcon.isInuse())   
  76.       {   
  77.         pcon.setInuse(true);   
  78.         return pcon.getConnection();   
  79.       }   
  80.     }   
  81.     try  
  82.     {   
  83.       con=DriverManager.getConnection(url,username,password);   
  84.       con.setAutoCommit(false);   
  85.   
  86.       PooledConnection pcon=new PooledConnection(con);   
  87.       pcon.setInuse(true);   
  88.   
  89.       pool.add(pcon);   
  90.     }   
  91.     catch(Exception e)   
  92.     {   
  93.       e.printStackTrace();   
  94.     }   
  95.     return con;   
  96.   }   
  97.   
  98.   //释放数据库连接对象   
  99.   public synchronized void releaseConnection(Connection con)   
  100.   {   
  101.     for(int i=pool.size()-1;i>=0;i--)   
  102.     {   
  103.       PooledConnection pcon=(PooledConnection)pool.get(i);   
  104.       if(pcon.getConnection().equals(con))   
  105.       {   
  106.         pcon.setInuse(false);   
  107.         return;   
  108.       }   
  109.     }   
  110.   }   
  111.   
  112.   
  113.   //关闭数据库连接池   
  114.   public synchronized void closeConnectionPool()   
  115.   {   
  116.     try  
  117.     {   
  118.       for(int i=pool.size()-1;i>=0;i--)   
  119.       {   
  120.         PooledConnection pcon=(PooledConnection)pool.get(i);   
  121.         if(pcon.isInuse())   
  122.         {   
  123.           Thread.sleep(500);   
  124.         }   
  125.         pcon.close();   
  126.         pool.remove(pcon);   
  127.       }   
  128.     }   
  129.     catch(Exception e)   
  130.     {   
  131.       e.printStackTrace();   
  132.     }   
  133.   }   
  134.   
  135.   public void run()   
  136.   {   
  137.     while(true)   
  138.     {   
  139.       try  
  140.       {   
  141.         synchronized(this)   
  142.         {   
  143.           while(pool.size()>maxsize)   
  144.           {   
  145.             PooledConnection pcon=null;   
  146.   
  147.             for(int i=pool.size()-1;i>=0;i--)   
  148.             {   
  149.               PooledConnection pn=(PooledConnection) pool.get(i);   
  150.               if(!pn.isInuse())   
  151.               {   
  152.                 pcon=pn;   
  153.               }   
  154.               if(pcon!=null)   
  155.               {   
  156.                 pool.remove(pcon);   
  157.               }   
  158.               else  
  159.               {   
  160.                 break;   
  161.               }   
  162.             }   
  163.           }   
  164.         }   
  165.         Thread.sleep(1000*60);   
  166.       }   
  167.       catch(Exception e)   
  168.       {   
  169.         e.printStackTrace();   
  170.       }   
  171.     }   
  172.   }   
  173.   
  174.   private static ConnectionPool conPool=new ConnectionPool();   
  175.   private ConnectionPool()   
  176.   {   
  177.     this.initJDBC();   
  178.     this.initConnectionPool();   
  179.   
  180.     this.start();   
  181.   }   
  182.   
  183.   
  184.   public static ConnectionPool getInstance()   
  185.   {   
  186.     return conPool;   
  187.   }   
  188. }   
  189.   

 

PooledConnection.java

java 代码
  1. package database;   
  2.   
  3. import java.sql.*;   
  4.   
  5.   
  6. public class PooledConnection   
  7. {   
  8.   //保存真实的数据库连接对象   
  9.   private Connection con;   
  10.   //设立一个标志位,表示此数据库连接对象是否处于空闲状态   
  11.   private boolean inuse;   
  12.   
  13.   public PooledConnection(Connection con)   
  14.   {   
  15.     this.con=con;   
  16.   }   
  17.   public Connection getConnection()   
  18.   {   
  19.     return con;   
  20.   }   
  21.   //设置数据库连接对象处于使用状态   
  22.   public void setInuse(boolean inuse)   
  23.   {   
  24.     this.inuse=inuse;   
  25.   }   
  26.   //判断数据库连接对象是否为使用状态   
  27.   public boolean isInuse()   
  28.   {   
  29.     return this.inuse;   
  30.   }   
  31.   //关闭真实的数据库连接对象   
  32.   public void close()   
  33.   {   
  34.     try  
  35.     {   
  36.       if(con!=null)   
  37.       {   
  38.         con.close();   
  39.       }   
  40.       con=null;   
  41.     }   
  42.     catch(Exception e)   
  43.     {   
  44.       e.printStackTrace();   
  45.     }   
  46.   }   
  47. }   
  48.   
  49.   
  50.  ConnectionPool.java  

你可能感兴趣的:(java,thread,sql,jdbc,sun)