zoukankan      html  css  js  c++  java
  • Java Web ConnectionPool (连接池技术)

    根目录下:

    dbpool.properties

    代码:

    driverClassName=oracle.jdbc.driver.OracleDriver
    username
    =scott
    password
    =tiger
    url
    =jdbc:oracle:thin:@192.168.1.20:1521:ora9
    poolSize
    =10

    ConnectionPool.java

    代码:

    package webbook.util;
    
    import java.io.FileInputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    import java.util.Vector;
    
    public class ConnectionPool {
    
    	private Vector<Connection> pool;
    
    	private String url;
    
    	private String username;
    
    	private String password;
    
    	private String driverClassName;
    
    	/**
    	 * 连接池的大小,也就是连接池中有多少个数据库连接。
    	 */
    	private int poolSize = 1;
    
    	private static ConnectionPool instance = null;
    
    	/**
    	 * 私有的构造方法,禁止外部创建本类的对象,要想获得本类的对象,通过<code>getIstance</code>方法。
    	 * 使用了设计模式中的单子模式。
    	 */
    	private ConnectionPool() {
    		init();
    	}
    
    	/**
    	 * 连接池初始化方法,读取属性文件的内容 建立连接池中的初始连接
    	 */
    	private void init() {
    		pool = new Vector<Connection>(poolSize);
    		readConfig();
    		addConnection();
    	}
    
    	/**
    	 * 返回连接到连接池中
    	 */
    	public synchronized void release(Connection conn) {
    		pool.add(conn);
    
    	}
    
    	/**
    	 * 关闭连接池中的所有数据库连接
    	 */
    	public synchronized void closePool() {
    		for (int i = 0; i < pool.size(); i++) {
    			try {
    				((Connection) pool.get(i)).close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			pool.remove(i);
    		}
    	}
    
    	/**
    	 * 返回当前连接池的一个对象
    	 */
    	public static ConnectionPool getInstance() {
    		if (instance == null) {
    			instance = new ConnectionPool();
    		}
    		return instance;
    	}
    
    	/**
    	 * 返回连接池中的一个数据库连接
    	 */
    	public synchronized Connection getConnection() { 
    		if (pool.size() > 0) {
    			Connection conn = pool.get(0);
    			pool.remove(conn);
    			return conn;
    		} else {
    			return null;
    		}
    	}
    
    	/**
    	 * 在连接池中创建初始设置的的数据库连接
    	 */
    	private void addConnection() {
    		Connection conn = null;
    		for (int i = 0; i < poolSize; i++) {
    
    			try {
    				Class.forName(driverClassName);
    				conn = java.sql.DriverManager.getConnection(url, username, password);
    				pool.add(conn);
    
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    
    		}
    	}
    
    	/**
    	 * 读取设置连接池的属性文件
    	 */
    	private void readConfig() {
    		try {
    			String path = System.getProperty("user.dir") + "\\dbpool.properties";
    			FileInputStream is = new FileInputStream(path);
    			Properties props = new Properties();
    			props.load(is);
    			this.driverClassName = props.getProperty("driverClassName");
    			this.username = props.getProperty("username");
    			this.password = props.getProperty("password");
    			this.url = props.getProperty("url");
    			this.poolSize = Integer.parseInt(props.getProperty("poolSize"));
    		} catch (Exception e) {
    			e.printStackTrace();
    			System.err.println("读取属性文件出错. ");		
    		}
    	}
    }
    

    ConnectionPoolTest.java

    代码:

    package webbook.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class ConnectionPoolTest {
    
    	public static void main(String[] args) throws Exception {
    		String sql = "select id,name,phone from guestbook";
    		long start = System.currentTimeMillis();
    		ConnectionPool pool = null;
    
    		for (int i = 0; i < 100; i++) {
    			pool = ConnectionPool.getInstance();
    			Connection conn = pool.getConnection();
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery(sql);
    			while (rs.next()) {
    			}
    			rs.close();
    			stmt.close();
    			pool.release(conn);
    		}
    		pool.closePool();
    		System.out.println("经过100次的循环调用,使用连接池花费的时间:" + (System.currentTimeMillis() - start) + "ms\n");
    
    		String hostName = "192.168.1.20";
    		String driverClass = "oracle.jdbc.driver.OracleDriver";
    		String url = "jdbc:oracle:thin:@" + hostName + ":1521:ora9";
    		String user = "scott";
    		String password = "tiger";
    		start = System.currentTimeMillis();
    		
    		for (int i = 0; i < 100; i++) {
    			Class.forName(driverClass);
    			Connection conn = DriverManager.getConnection(url, user, password);
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery(sql);
    			while (rs.next()) {
    			}
    			rs.close();
    			stmt.close();
    			conn.close();
    		}
    		System.out.println("经过100次的循环调用,不使用连接池花费的时间:" + (System.currentTimeMillis() - start) + "ms");
    	}
    }
    

  • 相关阅读:
    开源软件的国内镜像
    ruby学习之路(一)
    VBS正则表达式
    fscanf和feof的组合使用
    计算机产生随机数
    常用:JQ
    unitegallery 测试使用-自动播放关闭
    H5重力感应(转)
    JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数 保留n位小数
    input禁止显示历史输入记录
  • 原文地址:https://www.cnblogs.com/hongten/p/2113442.html
Copyright © 2011-2022 走看看