📄 请求的重定向
字号:
118 if (name.endsWith(".url")) {119 String poolName = name.substring(0, name.lastIndexOf("."));120 String url = props.getProperty(poolName + ".url");121 if (url == null) {122 log("没有为连接池" + poolName + "指定URL");123 continue;124 }125 String user = props.getProperty(poolName + ".user");126 String password = props.getProperty(poolName + ".password");127 String maxconn = props.getProperty(poolName + ".maxconn", "0");128 int max;129 try {130 max = Integer.valueOf(maxconn).intValue();131 }132 catch (NumberFormatException e) {133 log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);134 max = 0;135 }136 DBConnectionPool pool =137 new DBConnectionPool(poolName, url, user, password, max);138 pools.put(poolName, pool);139 log("成功创建连接池" + poolName);140 }141 }142 }143144 /**145 * 读取属性完成初始化146 */147 private void init() {148 InputStream is = getClass().getResourceAsStream("/db.properties");149 Properties dbProps = new Properties();150 try {151 dbProps.load(is);152 }153 catch (Exception e) {154 System.err.println("不能读取属性文件. " +155 "请确保db.properties在CLASSPATH指定的路径中");156 return;157 }158 String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");159 try {160 log = new PrintWriter(new FileWriter(logFile, true), true);161 }162 catch (IOException e) {163 System.err.println("无法打开日志文件: " + logFile);164 log = new PrintWriter(System.err);165 }166 loadDrivers(dbProps);167 createPools(dbProps);168 }169170 /**171 * 装载和注册所有JDBC驱动程序172 *173 * @param props 属性174 */175 private void loadDrivers(Properties props) {176 String driverClasses = props.getProperty("drivers");177 StringTokenizer st = new StringTokenizer(driverClasses);178 while (st.hasMoreElements()) {179 String driverClassName = st.nextToken().trim();180 try {181 Driver driver = (Driver)182 Class.forName(driverClassName).newInstance();183 DriverManager.registerDriver(driver);184 drivers.addElement(driver);185 log("成功注册JDBC驱动程序" + driverClassName);186 }187 catch (Exception e) {188 log("无法注册JDBC驱动程序: " +189 driverClassName + ", 错误: " + e);190 }191 }192 }193194 /**195 * 将文本信息写入日志文件196 */197 private void log(String msg) {198 log.println(new Date() + ": " + msg);199 }200201 /**202 * 将文本信息与异常写入日志文件203 */204 private void log(Throwable e, String msg) {205 log.println(new Date() + ": " + msg);206 e.printStackTrace(log);207 }208209 /**210 * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最211 * 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.212 */213 class DBConnectionPool {214 private int checkedOut;215 private Vector freeConnections = new Vector();216 private int maxConn;217 private String name;218 private String password;219 private String URL;220 private String user;221222 /**223 * 创建新的连接池224 *225 * @param name 连接池名字226 * @param URL 数据库的JDBC URL227 * @param user 数据库帐号,或 null228 * @param password 密码,或 null229 * @param maxConn 此连接池允许建立的最大连接数230 */231 public DBConnectionPool(String name, String URL, String user, String password,232 int maxConn) {233 this.name = name;234 this.URL = URL;235 this.user = user;236 this.password = password;237 this.maxConn = maxConn;238 }239240 /**241 * 将不再使用的连接返回给连接池242 *243 * @param con 客户程序释放的连接244 */245 public synchronized void freeConnection(Connection con) {246 // 将指定连接加入到向量末尾247 freeConnections.addElement(con);248 checkedOut--;249 notifyAll();250 }251252 /**253 * 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接254 * 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,255 * 然后递归调用自己以尝试新的可用连接.256 */257 public synchronized Connection getConnection() {258 Connection con = null;259 if (freeConnections.size() > 0) {260 // 获取向量中第一个可用连接261 con = (Connection) freeConnections.firstElement();262 freeConnections.removeElementAt(0);263 try {264 if (con.isClosed()) {265 log("从连接池" + name+"删除一个无效连接");266 // 递归调用自己,尝试再次获取可用连接267 con = getConnection();268 }269 }270 catch (SQLException e) {271 log("从连接池" + name+"删除一个无效连接");272 // 递归调用自己,尝试再次获取可用连接273 con = getConnection();274 }275 }276 else if (maxConn == 0 || checkedOut < maxConn) {277 con = newConnection();278 }279 if (con != null) {280 checkedOut++;281 }282 return con;283 }284285 /**286 * 从连接池获取可用连接.可以指定客户程序能够等待的最长时间287 * 参见前一个getConnection()方法.288 *289 * @param timeout 以毫秒计的等待时间限制290 */291 public synchronized Connection getConnection(long timeout) {292 long startTime = new Date().getTime();293 Connection con;294 while ((con = getConnection()) == null) {295 try {296 wait(timeout);297 }298 catch (InterruptedException e) {}299 if ((new Date().getTime() - startTime) >= timeout) {300 // wait()返回的原因是超时301 return null;302 }303 }304 return con;305 }306307 /**308 * 关闭所有连接309 */310 public synchronized void release() {311 Enumeration allConnections = freeConnections.elements();312 while (allConnections.hasMoreElements()) {313 Connection con = (Connection) allConnections.nextElement();314 try {315 con.close();316 log("关闭连接池" + name+"中的一个连接");317 }318 catch (SQLException e) {319 log(e, "无法关闭连接池" + name+"中的连接");320 }321 }322 freeConnections.removeAllElements();323 }324325 /**326 * 创建新的连接327 */328 private Connection newConnection() {329 Connection con = null;330 try {331 if (user == null) {332 con = DriverManager.getConnection(URL);333 }334 else {335 con = DriverManager.getConnection(URL, user, password);336 }337 log("连接池" + name+"创建一个新的连接");338 }339 catch (SQLException e) {340 log(e, "无法创建下列URL的连接: " + URL);341 return null;342 }343 return con;344 }345 }346 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -