构建个人博客系统四(建立数据库连接池)

本文介绍了一种通过连接池管理数据库连接的方法,以减少频繁创建和关闭数据库连接带来的资源消耗。通过单例模式创建连接池,并在系统启动时初始化一定数量的连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

        上文建立了DBUtil来进行数据库操作,这种每次操作都要进行数据库连接打开,数据库连接关闭都是非常消耗系统资源的。下面我来对它进行改进。思路是系统维护一个连接池,池中预放置若干连接,每次数据库操作时从池中拿一个,用后关闭。如果用完连接,再创建相同数目的连接放入池中。

 

        系统如何维护连接池呢?可以创建一个单子对象。在系统中只有一个实例,对象有一vectior来保存connection。我采用在数据库启动的时候来创建连接池和数据库连接的操作。

       

        这个servlet在系统启动时加载。load-on-startup 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,正数的值越小,启动该servlet的优先级越高。当load-on-startup是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

  1.  <servlet>
  2.   <servlet-name>sysConfig</servlet-name>
  3.   <servlet-class>com.mycompany.sys.SysConfig</servlet-class>
  4.   <load-on-startup>1</load-on-startup>
  5.  </servlet>
  1. package com.mycompany.sys;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import com.mycompany.db.*;
  5. public class SysConfig extends HttpServlet {
  6.     public void init() throws ServletException {
  7.         ConnPool.getCP().createConns();
  8.     }
  9. }

ConnPool是连接池对象。

  1. package com.mycompany.db;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. import java.util.Vector;
  6. public class ConnPool {
  7.     private static Vector conections;
  8.     private static ConnPool cp;
  9.     private ConnPool() {
  10.     }
  11.     public static ConnPool getCP() {
  12.         if (cp == null) {
  13.             cp = new ConnPool();
  14.             return cp;
  15.         } else {
  16.             return cp;
  17.         }
  18.     }
  19.     public void createConns() {
  20.         conections = new Vector();
  21.         try {
  22.             Class.forName("com.mysql.jdbc.Driver");
  23.         } catch (ClassNotFoundException e) {
  24.             // TODO Auto-generated catch block
  25.             e.printStackTrace();
  26.         }
  27.         try {
  28.             for (int i = 0; i < 100; i++) {
  29.                 Connection conn;
  30.                 conn = DriverManager
  31.                         .getConnection("jdbc:mysql://localhost:3306/sclBlog?user=root&password=root");
  32.                 conections.addElement(conn);
  33.             }
  34.         } catch (SQLException e) {
  35.             // TODO Auto-generated catch block
  36.             e.printStackTrace();
  37.         }
  38.     }
  39.     public Connection getConnection() {
  40.         Connection conn = null;
  41.         if (conections.size() <= 0) {
  42.             createConns();
  43.         }
  44.         for (int i = 0; i < conections.size(); i++) {
  45.             Connection connection = (Connection)conections.elementAt(i);
  46.             try {
  47.                 if(!connection.isClosed()){
  48.                     conn = connection;
  49.                     conections.removeElement(connection);
  50.                     break;
  51.                 }
  52.             } catch (SQLException e) {
  53.                 // TODO Auto-generated catch block
  54.                 e.printStackTrace();
  55.             }
  56.         }
  57.         return conn;
  58.     }
  59.     public static Vector getConections() {
  60.         return conections;
  61.     }
  62.     public static void setConections(Vector conections) {
  63.         ConnPool.conections = conections;
  64.     }
  65. }

ConnPool维护一个vector来保持connection,但系统用完connection时,就调用createConns来创建若干连接放入池中备用。这样至少不用每次都创建连接啦。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值