import java.sql.*;
import java.util.*;

public class DBConnectionPool {
	static private DBConnectionPool instance;
	private int checkedOut;
        private Vector freeConnections = new Vector();
        private String password;
        private String URL;
        private String user;
        private int maxConn;

	/* インスタンスの作成 */
	static synchronized public DBConnectionPool getInstance() {
		if (instance == null) {
			instance = new DBConnectionPool();
		}
		return instance;
	}

	private DBConnectionPool(){
		this.URL = "jdbc:odbc:SCHEDULE";
		this.user = "user";
		this.password = "pass";
		this.maxConn = 10;
	}

	/* コネクションの開放 */
	public synchronized void freeConnection(Connection con) {
		freeConnections.addElement(con);
		checkedOut--;
		notifyAll();
	}

	/* コネクションの取得 */
	public synchronized Connection getConnection() {
		Connection con = null;
		if (freeConnections.size() > 0) {
			con = (Connection)freeConnections.firstElement();
			freeConnections.removeElementAt(0);

			try {
				if (con.isClosed()) {
					con = getConnection();
				}
			}catch (SQLException e) {
				con = getConnection();
			}
		}else if (maxConn == 0 || checkedOut < maxConn) {
			con = newConnection();
		}

		if (con != null) {
			checkedOut++;
		}
		return con;
	}

	/* 全てのコネクションの開放 */
	public synchronized void release() {
		Enumeration allConnections = freeConnections.elements();
		while (allConnections.hasMoreElements()) {
			Connection con = (Connection) allConnections.nextElement();
			try {
				con.close();
			}catch (SQLException e) {
				System.out.println("Can't close connection pool");
			}
		}
		freeConnections.removeAllElements();
	}

	/* 新規コネクションの作成 */
	private Connection newConnection() {
		Connection con = null;
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			con = DriverManager.getConnection(URL, user, password);
		}catch(ClassNotFoundException e){
			System.out.println("Can't create a new connection for " + URL);
			return null;
		}catch (SQLException e){
			System.out.println("Can't create a new connection for " + URL);
			return null;
		}
		return con;
	}
}


