Java数据库连接池实现

简介:

至于Java数据库连接池的原理就不细说了,百度一下大把。在这里只是把个人学习中的结果积累下来。

代码上也基本都有注释。

首先写一个读取本地数据库驱动,数据库用户名、数据库密码、连接数的类。

 
  1. XML/HTML 代码复制内容到剪贴板  
  2.       
  3. package cn.cate.utils;          
  4.           
  5. import java.io.FileNotFoundException;          
  6. import java.io.FileReader;          
  7. import java.io.IOException;          
  8. import java.util.Properties;          
  9.           
  10. public class PoolProperties {          
  11.           
  12.     private Properties properties;          
  13.     private String driver;          
  14.     private String url;          
  15.     private String user;          
  16.     private String password;          
  17.     private int maxConn;          
  18.     private int minConn;          
  19.               
  20.     public PoolProperties(){          
  21.         properties = new Properties();          
  22.         String path = getClass().getProtectionDomain().getCodeSource().getLocation().toString();          
  23.         pathpathpath = path.substring(6, path.length());          
  24.         if (path.indexOf("WEB-INF") > 0) {          
  25.               pathpathpath = path.substring(0, path.indexOf("/WEB-INF") + 9) + "lib/";          
  26.         }else{          
  27.               path = "d:";          
  28.         }          
  29.         try {          
  30.             this.properties.load(new FileReader(path + "db.pro"));          
  31.         }catch (FileNotFoundException e) {          
  32.             e.printStackTrace();          
  33.         }catch (IOException e) {          
  34.             e.printStackTrace();          
  35.         }          
  36.         this.setDriver(properties.getProperty("driver"));          
  37.         this.setUrl(properties.getProperty("url"));          
  38.         this.setUser(properties.getProperty("user"));          
  39.         this.setPassword(properties.getProperty("password"));          
  40.         this.setMaxConn(Integer.parseInt(properties.getProperty("maxConn")));          
  41.         this.setMinConn(Integer.parseInt(properties.getProperty("minConn")));          
  42.     }          
  43.               
  44.               
  45.     public Properties getProperties() {          
  46.         return properties;          
  47.     }          
  48.           
  49.     public void setProperties(Properties properties) {          
  50.         this.properties = properties;          
  51.     }          
  52.           
  53.     public String getDriver() {          
  54.         return driver;          
  55.     }          
  56.           
  57.     public void setDriver(String driver) {          
  58.         this.driver = driver;          
  59.     }          
  60.           
  61.     public String getUrl() {          
  62.         return url;          
  63.     }          
  64.           
  65.     public void setUrl(String url) {          
  66.         this.url = url;          
  67.     }          
  68.           
  69.     public String getUser() {          
  70.         return user;          
  71.     }          
  72.           
  73.     public void setUser(String user) {          
  74.         this.user = user;          
  75.     }          
  76.           
  77.     public String getPassword() {          
  78.         return password;          
  79.     }          
  80.           
  81.     public void setPassword(String password) {          
  82.         this.password = password;          
  83.     }          
  84.           
  85.     public int getMaxConn() {          
  86.         return maxConn;          
  87.     }          
  88.           
  89.     public void setMaxConn(int maxConn) {          
  90.         this.maxConn = maxConn;          
  91.     }          
  92.           
  93.     public int getMinConn() {          
  94.         return minConn;          
  95.     }          
  96.           
  97.     public void setMinConn(int minConn) {          
  98.         this.minConn = minConn;          
  99.     }          
  100.               
  101.               
  102. }      

db.pro的内容如下:

  driver=com.mysql.jdbc.Driver         maxConn=10           minConn=1           url=jdbc:mysql://127.0.0.1:3306/cate           user=root           password=11111

然后定义一个数据库连接池:DBConnectionPool

 

 
  1. Java 代码复制内容到剪贴板  
  2.       
  3. import java.sql.Connection;          
  4. import java.sql.DriverManager;          
  5. import java.sql.SQLException;          
  6. import java.util.ArrayList;          
  7. import java.util.Iterator;          
  8. import java.util.List;          
  9.           
  10. /*       
  11. * 此内部类定义了一个连接池,它能够根据要求创建连接,直到预定的最大连接数为止。       
  12. * 在返回连接给客户程序之前,它能够验证连接的有效性。       
  13. */          
  14. public class DBConnectionPool {          
  15.           
  16.     /*       
  17.      * 连接池       
  18.      */          
  19.     private List<Connection> freeConnections = new ArrayList<Connection>();          
  20.     private Connection conn = null;          
  21.     private int connect = 0;     //使用的连接数          
  22.     private int maxConn;      //最大连接数          
  23.     private String driver;    //数据库驱动          
  24.     private String url;     //数据库连接地址          
  25.     private String user;     //用户名          
  26.     private String password;      //用户名          
  27.               
  28.     public DBConnectionPool(String driver,String URL,String user,String password,int maxConn){          
  29.         this.driver = driver;          
  30.         this.url = URL;          
  31.         this.user = user;          
  32.         this.password = password;          
  33.         this.maxConn = maxConn;          
  34.         poolInfo();          
  35.     }          
  36.               
  37.     /*       
  38.      * 显示准备创建连接池的信息       
  39.      */          
  40.     private void poolInfo(){          
  41.         Connection conn = this.newConnection();          
  42.         freeConnections.add(conn);          
  43.         for(int i = 0;i < this.maxConn - 1;i++){          
  44.             Connection freeConn = conn;          
  45.             freeConnections.add(freeConn);          
  46.         }          
  47.     }          
  48.               
  49.     /*       
  50.      * 用完,释放一个连接       
  51.      */          
  52.     public synchronized void freeConnection(Connection conn){          
  53.         this.freeConnections.add(conn);          
  54.         this.connect--;          
  55.     }          
  56.               
  57.     /*       
  58.      * 从连接池中获取一个可用连接,当无法从连接池中获取可用连接时,新创建一个连接       
  59.      */          
  60.     public synchronized Connection getConnection(){          
  61.         if(this.freeConnections.size() > 0){          
  62.             /*       
  63.              * 当在连接池中取出一个连接后,删除此连接       
  64.              */          
  65.             conn = this.freeConnections.get(0);          
  66.             this.freeConnections.remove(0);          
  67.         }          
  68.         /*       
  69.          * 当取出的连接为null时,递归调用自己,直到获得一个可用连接为止       
  70.          */          
  71.         if(conn == null){          
  72.             conn = getConnection();          
  73.         }else{          
  74.             conn = newConnection();          
  75.         }          
  76.         if(this.maxConn == 0 || this.maxConn < this.connect){          
  77.             /*       
  78.              * 等待超过最大连接时       
  79.              */          
  80.             conn = null;          
  81.         }          
  82.         if(conn != null){          
  83.             this.connect++;          
  84.         }          
  85.         return conn;          
  86.     }          
  87.               
  88.     /*       
  89.      * 释放全部连接       
  90.      */          
  91.     public synchronized void release(){          
  92.         Iterator<Connection> allConns = this.freeConnections.iterator();          
  93.         while(allConns.hasNext()){          
  94.             Connection conn = (Connection)allConns.next();          
  95.             try{          
  96.                 if(null != conn){          
  97.                     conn.close();          
  98.                 }          
  99.                 conn = null;          
  100.             }catch(SQLException e){          
  101.                 e.printStackTrace();          
  102.             }          
  103.         }          
  104.         this.freeConnections.clear();          
  105.     }          
  106.               
  107.     /*       
  108.      * 创建一个数据库连接对象       
  109.      */          
  110.     private Connection newConnection(){          
  111.         try{          
  112.             Class.forName(driver);          
  113.         }catch(ClassNotFoundException e2){          
  114.             e2.printStackTrace();          
  115.         }          
  116.         try{          
  117.             conn = DriverManager.getConnection(url,user,password);          
  118.         }catch(SQLException e3){          
  119.             e3.printStackTrace();          
  120.             System.exit(0);          
  121.         }          
  122.         return conn;          
  123.     }          
  124. }      

最后提供一个连接池的管理类:

 

 
  1. Java 代码复制内容到剪贴板  
  2.       
  3. import java.sql.Connection;          
  4. import java.util.Enumeration;          
  5. import java.util.Hashtable;          
  6.           
  7. import cn.cate.utils.PoolProperties;          
  8.           
  9. /*       
  10. * 连接池的管理类,负责读取配置连接池的文件,并创建连接池       
  11. * 从连接池中获取,释放连接       
  12. */          
  13. public class DBConnectionManager {          
  14.           
  15.     /*       
  16.      * 唯一数据库连接池管理实例类       
  17.      * 使用单例模式创建       
  18.      */          
  19.     private static DBConnectionManager instance;          
  20.               
  21.     /*       
  22.      * 连接池的集合       
  23.      */          
  24.     private Hashtable<String,DBConnectionPool> pools = new Hashtable<String,DBConnectionPool>();          
  25.     private static String poolName = "MYSQL_MZBA";      //连接池名字          
  26.               
  27.     public static synchronized DBConnectionManager getInstance(){          
  28.         if(instance == null){          
  29.             instance = new DBConnectionManager();          
  30.         }          
  31.         return instance;          
  32.     }          
  33.               
  34.     /*       
  35.      * 只允许内部实例化管理类       
  36.      */          
  37.     private DBConnectionManager(){          
  38.         this.init();          
  39.     }          
  40.               
  41.     /*       
  42.      * 加载驱动程序       
  43.      */          
  44.     private void init(){          
  45.         PoolProperties poolProperties = new PoolProperties();          
  46.         DBConnectionPool pool = new DBConnectionPool(poolProperties.getDriver(), poolProperties.getUrl(),           
  47.                 poolProperties.getUser(), poolProperties.getPassword(), poolProperties.getMaxConn());          
  48.         pools.put(poolName, pool);          
  49.     }          
  50.               
  51.     /*       
  52.      * 根据连接池的名字得到一个连接       
  53.      */          
  54.     public Connection getConnection(){          
  55.         DBConnectionPool pool = null;          
  56.         Connection conn = null;          
  57.         pool = pools.get(poolName);          
  58.         try{          
  59.             conn = pool.getConnection();          
  60.         }catch(Exception e){          
  61.             e.printStackTrace();          
  62.         }          
  63.         return conn;          
  64.     }          
  65.     /*       
  66.      * 释放一个连接       
  67.      */          
  68.     public synchronized void freeConnection(Connection conn){          
  69.         DBConnectionPool pool = pools.get(poolName);          
  70.         if(pool != null){          
  71.             pool.freeConnection(conn);          
  72.         }          
  73.     }          
  74.     /*       
  75.      * 释放所有连接       
  76.      */          
  77.     public synchronized void release(){          
  78.         Enumeration<DBConnectionPool> allpools = pools.elements();          
  79.         while(allpools.hasMoreElements()){          
  80.             DBConnectionPool pool = allpools.nextElement();          
  81.             if(pool != null){          
  82.                 pool.release();          
  83.             }          
  84.         }          
  85.         pools.clear();          
  86.     }          
  87.           
  88. }      

 



     本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/962458,如需转载请自行联系原作者





相关文章
|
17天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
50 5
|
1月前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
55 5
|
29天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
44 3
|
29天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
52 2
|
29天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
48 2
|
29天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
15 2
|
1月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
28 4
|
29天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
27 1
|
29天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
41 1
|
29天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
43 1