📄 dbconnectionmanager.java
字号:
/*
* Created on 2005-11-15
* Author 曹汕
* Version 1.0
* Copyright by CS.SSPKU Inc. All rights reserved.
*/
package com.struts.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.*;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author cs
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class DBConnectionManager {
private static DBConnectionManager instance;
private static int clients;
DBConnectionPool pool =null;
private Log log=LogFactory.getLog(this.getClass().getName());
//DBConnetionManager的构造函数是私有函数,以避免其他类创建其实例。
private DBConnectionManager() {
init();
}
// DBConnetionManager的客户调用getInstance()方法来得到该类的单一实例的引用。
// 单一的实例在第一次调用时创建,以后的调用返回该实例的静态应用。
// 一个计数器纪录所有的客户数,直到客户释放引用。这个计数器在以后用来协调关闭连接池。
public static synchronized DBConnectionManager getInstance() {
if (instance == null) {
instance = new DBConnectionManager();
}
clients++;
return instance;
}
// 一、初始化
// 构造函数调用一个私有的init()函数初始化对象。
private void init() {
InputStream is = null;
try {
is = new FileInputStream("d:\\Tomcat 5.0\\webapps\\struts\\WEB-INF\\classes\\Database.properties");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Properties dbProps = new Properties();
try {
dbProps.load(is);
}
catch (Exception e) {
System.err.println("Can not read the properties file. " + "Make sure Database.properties is in the CLASSPATH");
return;
}
String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");
loadDrivers(dbProps);
createPools(dbProps);
}
// 方法getResourceAsStream()是一个标准方法,用来打开一个外部输入文件。
// 文件的位置取决于类加载器,而标准的类加载器从classpath开始搜索。
// Db.properties文件是一个Porperties格式的文件,保存在连接池中定义的key-value对。
// 下面一些常用的属性可以定义:
// drivers 以空格分开的jdbc驱动程序的列表
// logfile 日志文件的绝对路径
// 每个连接池中还使用另一些属性。这些属性以连接池的名字开头:
// .url数据库的JDBC URL
// .maxconn最大连接数。0表示无限。
// .user连接池的用户名
// .password相关的密码
// url属性是必须的,其他属性可选。用户名和密码必须和所定义的数据库匹配。
/**
* 方法loadDrivers()将指定的所有jdbc驱动程序注册,装载
* @param props
*/
private void loadDrivers(Properties props) {
String driverClass = props.getProperty("DB.DriverName").trim();
try {
Driver driver = (Driver)Class.forName(driverClass).newInstance();
DriverManager.registerDriver(driver);
log.info("Registered JDBC driver " + driverClass);
}
catch (Exception e) {
log.info("Can not register JDBC driver: " + driverClass + ", Exception: " + e);
}
}
private void createPools(Properties props) {
String url = props.getProperty( "DB.Url");
String user = props.getProperty( "DB.User");
String password = props.getProperty("DB.Pwd");
String maxconn = props.getProperty( "DB.MaxConnections");
int max;
try {
max = Integer.valueOf(maxconn).intValue();
}
catch (NumberFormatException e) {
log.info("Invalid maxconn value " + maxconn);
max = 0;
}
String poolName="OracleDB Pool";
pool = new DBConnectionPool(url, user, password, max);
}
/**
* DBConnectionManager提供getConnection()方法和freeConnection方法,这些方法有客户程序使用。
* 所有的方法以连接池名字所参数,并调用特定的连接池对象。
* @param poolName 连接池名字
* @return Connection
*/
public Connection getConnection() {
if (pool != null) {
return pool.getConnection();
}
return null;
}
public void freeConnection(Connection con) {
if (pool != null) {
pool.freeConnection(con);
}
}
// 最后,由一个release()方法,用来完好地关闭连接池。
// 每个DBConnectionManager客户必须调用getInstance()方法引用。
// 有一个计数器跟踪客户的数量。方法release()在客户关闭时调用,计数器减1。
// 当最后一个客户释放,DBConnectionManager关闭所有的连接池。
public synchronized void release() {
// Wait until called by the last client
if (--clients != 0) {
return;
}
pool.release();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -