上文建立了DBUtil来进行数据库操作,这种每次操作都要进行数据库连接打开,数据库连接关闭都是非常消耗系统资源的。下面我来对它进行改进。思路是系统维护一个连接池,池中预放置若干连接,每次数据库操作时从池中拿一个,用后关闭。如果用完连接,再创建相同数目的连接放入池中。
系统如何维护连接池呢?可以创建一个单子对象。在系统中只有一个实例,对象有一vectior来保存connection。我采用在数据库启动的时候来创建连接池和数据库连接的操作。
这个servlet在系统启动时加载。load-on-startup 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,正数的值越小,启动该servlet的优先级越高。当load-on-startup是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
- <servlet>
- <servlet-name>sysConfig</servlet-name>
- <servlet-class>com.mycompany.sys.SysConfig</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- package com.mycompany.sys;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import com.mycompany.db.*;
- public class SysConfig extends HttpServlet {
- public void init() throws ServletException {
- ConnPool.getCP().createConns();
- }
- }
ConnPool是连接池对象。
- package com.mycompany.db;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Vector;
- public class ConnPool {
- private static Vector conections;
- private static ConnPool cp;
- private ConnPool() {
- }
- public static ConnPool getCP() {
- if (cp == null) {
- cp = new ConnPool();
- return cp;
- } else {
- return cp;
- }
- }
- public void createConns() {
- conections = new Vector();
- try {
- Class.forName("com.mysql.jdbc.Driver");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- for (int i = 0; i < 100; i++) {
- Connection conn;
- conn = DriverManager
- .getConnection("jdbc:mysql://localhost:3306/sclBlog?user=root&password=root");
- conections.addElement(conn);
- }
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public Connection getConnection() {
- Connection conn = null;
- if (conections.size() <= 0) {
- createConns();
- }
- for (int i = 0; i < conections.size(); i++) {
- Connection connection = (Connection)conections.elementAt(i);
- try {
- if(!connection.isClosed()){
- conn = connection;
- conections.removeElement(connection);
- break;
- }
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return conn;
- }
- public static Vector getConections() {
- return conections;
- }
- public static void setConections(Vector conections) {
- ConnPool.conections = conections;
- }
- }
ConnPool维护一个vector来保持connection,但系统用完connection时,就调用createConns来创建若干连接放入池中备用。这样至少不用每次都创建连接啦。