- 温柔一刀
- 等级:
- 性别:
- 文章: 801
- 积分: 1192
- 来自: 上海
|
实现简单的数据库连接池:
java 代码
-
-
-
- package com.zhupan.StrutsArticle.Utils;
-
- import java.sql.Connection;
-
- public class DBConnection {
- public static synchronized Connection getConnection() throws Exception {
- Connection conn = null;
- DBConnectionManager dbc;
- try {
- dbc = DBConnectionManager.getInstance();
- conn = dbc.getConnection(" idb ");
- } catch (Exception e) {
- }
- return conn;
- }
-
- }
java 代码
-
-
-
- package com.zhupan.StrutsArticle.Utils;
-
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.sql.Connection;
- import java.sql.Driver;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Date;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Properties;
- import java.util.StringTokenizer;
- import java.util.Vector;
-
-
-
-
-
-
- public class DBConnectionManager {
- static private DBConnectionManager instance;
-
- static private int clients;
-
- private Vector drivers = new Vector();
-
- private PrintWriter log;
-
- private Hashtable pools = new Hashtable();
-
-
-
-
-
-
-
- static synchronized public DBConnectionManager getInstance() {
- if (instance == null) {
- instance = new DBConnectionManager();
- }
- clients++;
- return instance;
- }
-
-
-
-
-
- private DBConnectionManager() {
- init();
- }
-
-
-
-
-
-
-
-
-
-
- public void freeConnection(String name, Connection con) {
- DBConnectionPool pool = (DBConnectionPool) pools.get(name);
- if (pool != null) {
- pool.freeConnection(con);
- }
- }
-
-
-
-
-
-
-
-
-
- public Connection getConnection(String name) {
- DBConnectionPool pool = (DBConnectionPool) pools.get(name);
- if (pool != null) {
- return pool.getConnection();
- }
- return null;
- }
-
-
-
-
-
-
-
-
-
-
-
- public Connection getConnection(String name, long time) {
- DBConnectionPool pool = (DBConnectionPool) pools.get(name);
- if (pool != null) {
- return pool.getConnection(time);
- }
- return null;
- }
-
-
-
-
-
- public synchronized void release() {
-
- if (--clients != 0) {
- return;
- }
-
- Enumeration allPools = pools.elements();
- while (allPools.hasMoreElements()) {
- DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
- pool.release();
- }
- Enumeration allDrivers = drivers.elements();
- while (allDrivers.hasMoreElements()) {
- Driver driver = (Driver) allDrivers.nextElement();
- try {
- DriverManager.deregisterDriver(driver);
- log(" 撤销JDBC驱动程序 " + driver.getClass().getName() + " 的注册 ");
- } catch (SQLException e) {
- log(e, " 无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());
- }
- }
- }
-
-
-
-
-
-
-
-
- private void createPools(Properties props) {
- Enumeration propNames = props.propertyNames();
- while (propNames.hasMoreElements()) {
- String name = (String) propNames.nextElement();
- if (name.endsWith(" .url ")) {
- String poolName = name.substring(0, name.lastIndexOf(" . "));
- String url = props.getProperty(poolName + " .url ");
- if (url == null) {
- log(" 没有为连接池 " + poolName + " 指定URL ");
- continue;
- }
- String user = props.getProperty(poolName + " .user ");
- String password = props.getProperty(poolName + " .password ");
- String maxconn = props.getProperty(poolName + " .maxconn ",
- " 0 ");
- int max;
- try {
- max = Integer.valueOf(maxconn).intValue();
- } catch (NumberFormatException e) {
- log(" 错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);
- max = 0;
- }
- DBConnectionPool pool = new DBConnectionPool(poolName, url,
- user, password, max);
- pools.put(poolName, pool);
- log(" 成功创建连接池 " + poolName);
- }
- }
- }
-
-
-
-
-
- private void init() {
- InputStream is = getClass().getResourceAsStream(" db.properties ");
- Properties dbProps = new Properties();
- try {
- dbProps.load(is);
- } catch (Exception e) {
- System.err.println(" 不能读取属性文件. "
- + " 请确保db.properties在CLASSPATH指定的路径中 ");
- return;
- }
- String logFile = dbProps.getProperty(" logfile ",
- " DBConnectionManager.log ");
- try {
- log = new PrintWriter(new FileWriter(logFile, true), true);
- } catch (IOException e) {
- System.err.println(" 无法打开日志文件: " + logFile);
- log = new PrintWriter(System.err);
- }
- loadDrivers(dbProps);
- createPools(dbProps);
- }
-
-
-
-
-
-
-
-
- private void loadDrivers(Properties props) {
- String driverClasses = props.getProperty(" drivers ");
- StringTokenizer st = new StringTokenizer(driverClasses);
- while (st.hasMoreElements()) {
- String driverClassName = st.nextToken().trim();
- try {
- Driver driver = (Driver) Class.forName(driverClassName)
- .newInstance();
- DriverManager.registerDriver(driver);
- drivers.addElement(driver);
- log(" 成功注册JDBC驱动程序 " + driverClassName);
- } catch (Exception e) {
- log(" 无法注册JDBC驱动程序: " + driverClassName + " , 错误: " + e);
- }
- }
- }
-
-
-
-
-
- private void log(String msg) {
- log.println(new Date() + " : " + msg);
- }
-
-
-
-
-
- private void log(Throwable e, String msg) {
- log.println(new Date() + " : " + msg);
- e.printStackTrace(log);
- }
-
-
-
-
-
- class DBConnectionPool {
- private int checkedOut;
-
- private Vector freeConnections = new Vector();
-
- private int maxConn;
-
- private String name;
-
- private String password;
-
- private String URL;
-
- private String user;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public DBConnectionPool(String name, String URL, String user,
- String password, int maxConn) {
- this.name = name;
- this.URL = URL;
- this.user = user;
- this.password = password;
- this.maxConn = maxConn;
- }
-
-
-
-
-
-
-
-
- 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()) {
- log(" 从连接池 " + name + " 删除一个无效连接 ");
-
- con = getConnection();
- }
- } catch (SQLException e) {
- log(" 从连接池 " + name + " 删除一个无效连接 ");
-
- con = getConnection();
- }
- } else if (maxConn == 0 || checkedOut < maxConn) {
- con = newConnection();
- }
- if (con != null) {
- checkedOut++;
- }
- return con;
- }
-
-
-
-
-
-
-
-
- public synchronized Connection getConnection(long timeout) {
- long startTime = new Date().getTime();
- Connection con;
- while ((con = getConnection()) == null) {
- try {
- wait(timeout);
- } catch (InterruptedException e) {
- }
- if ((new Date().getTime() - startTime) >= timeout) {
-
- return null;
- }
- }
- return con;
- }
-
-
-
-
-
- public synchronized void release() {
- Enumeration allConnections = freeConnections.elements();
- while (allConnections.hasMoreElements()) {
- Connection con = (Connection) allConnections.nextElement();
- try {
- con.close();
- log(" 关闭连接池 " + name + " 中的一个连接 ");
- } catch (SQLException e) {
- log(e, " 无法关闭连接池 " + name + " 中的连接 ");
- }
- }
- freeConnections.removeAllElements();
- }
-
-
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|