﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-龙舌兰酒-文章分类-J2EE</title><link>http://www.blogjava.net/alexzhang1980/category/8977.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:37:15 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:37:15 GMT</pubDate><ttl>60</ttl><item><title>JSP+JDBC(Thin模式)连接Oracle(转载）</title><link>http://www.blogjava.net/alexzhang1980/articles/37479.html</link><dc:creator>龙舌兰酒</dc:creator><author>龙舌兰酒</author><pubDate>Sun, 26 Mar 2006 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/alexzhang1980/articles/37479.html</guid><wfw:comment>http://www.blogjava.net/alexzhang1980/comments/37479.html</wfw:comment><comments>http://www.blogjava.net/alexzhang1980/articles/37479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexzhang1980/comments/commentRss/37479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexzhang1980/services/trackbacks/37479.html</trackback:ping><description><![CDATA[
		<p id="fp">在JSP中连接到Oracle一般有2种方式：<br /><br />　　1、Oracle JDBC的oci8方式<br /><br />　　2、Oracle JDBC的thin方式 <br /><br />　　我比较喜欢第2种，因为WEB发布服务器与数据库服务器一般都不会放在同一台电脑中，而在使用thin方式连接时，WEB服务器端无须安装oracle的客户端。<br /><br />　　在动手先代码之前，我们先把环境配置妥善。先从安装了Oracle的数据库服务器中，找到Oracle安装目录，然后将该目录下的jdbc\lib\classes12.jar文件拷贝到WEB发布服务器的某个目录。假设就直接放在C:\根目录下吧，然后把该路径添加到‘系统--高级--环境变量’中变量名为‘CLASSPATH’的值中，如：D:\Program Files\SQLLIB\java\db2java.zip;D:\Program Files\SQLLIB\java\runtime.zip;c:classes12.jar; 也就是让java能够找到这个包。<br /><br />　　配置好环境后，我们就开始开始动手写代码了。关于数据库连接的代码，应该写个专门的连接类来调用，没必要想网络上有些文章那样，直接写到JSP的代码中。<br /><br />　　关于连接的代码很简单<br /><br />private Connection newConnection(String user,String password) {<br />Connection con = null; <br />try { <br />Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />con = DriverManager.getConnection (“jdbc:oracle:thin:@192.168.96.1:1521:oracle9i”,user,password); <br />} <br />catch (SQLException e) { <br />return null; <br />} <br />return con; <br />}  <br /><br />　　如果帐号密码没有错，那这个函数就应该能返回个可用的连接。但如此简单的连接在一个项目中使用，是远远达不到效果的。我们可以在这个数据库连接类中加入更多的功能，如连接池等等。下面我就把该数据库连接类的代码详细的列出来，大家可以参考参考。<br /><br />/*<br />* @Title 公司网站<br />* @Author: zf<br />* @Version 1.0<br />* @Memo:定义数据库连接及其数据库连接池等<br />*/<br />package com.kingson.db;<br /><br />import java.io.*;<br />import java.sql.*;<br />import java.util.*;<br />import java.util.Date;<br /><br />public class DBConnectionManager {<br />static private DBConnectionManager instance; // 唯一实例<br />static private int clients;<br /><br />private Vector drivers = new Vector();<br />private PrintWriter log;<br />private Hashtable pools = new Hashtable();<br /><br />/**<br />* 返回唯一实例.如果是第一次调用此方法,则创建实例<br />*<br />* @return DBConnectionManager 唯一实例<br />*/<br />static synchronized public DBConnectionManager getInstance() {<br />if (instance == null) {<br />instance = new DBConnectionManager();<br />}<br />clients++;<br />return instance;<br />}<br /><br />/**<br />* 建构函数私有以防止其它对象创建本类实例<br />*/<br />private DBConnectionManager() {<br />init();<br />}<br /><br />/**<br />* 将连接对象返回给由名字指定的连接池<br />*<br />* @param name 在属性文件中定义的连接池名字<br />* @param con 连接对象<br />*/<br />public void freeConnection(String name, Connection con) {<br />DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />if (pool != null) {<br />pool.freeConnection(con);<br />}<br />}<br /><br />/**<br />* 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数<br />* 限制,则创建并返回新连接<br />*<br />* @param name 在属性文件中定义的连接池名字<br />* @return Connection 可用连接或null<br />*/<br />public Connection getConnection(String name) {<br />DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />if (pool != null) {<br />return pool.getConnection();<br />}<br />return null;<br />}<br /><br />/**<br />* 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,<br />* 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.<br />*<br />* @param name 连接池名字<br />* @param time 以毫秒计的等待时间<br />* @return Connection 可用连接或null<br />*/<br />public Connection getConnection(String name, long time) {<br />DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br />if (pool != null) {<br />return pool.getConnection(time);<br />}<br />return null;<br />}<br /><br />/**<br />* 关闭所有连接,撤销驱动程序的注册<br />*/<br />public synchronized void release() {<br />// 等待直到最后一个客户程序调用<br />if (--clients != 0) {<br />return;<br />}<br /><br />Enumeration allPools = pools.elements();<br />while (allPools.hasMoreElements()) {<br />DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();<br />pool.release();<br />}<br />Enumeration allDrivers = drivers.elements();<br />while (allDrivers.hasMoreElements()) {<br />Driver driver = (Driver) allDrivers.nextElement();<br />try {<br />DriverManager.deregisterDriver(driver);<br />log("撤销JDBC驱动程序 " + driver.getClass().getName()+"的注册");<br />}<br />catch (SQLException e) {<br />log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());<br />}<br />}<br />}<br /><br />/**<br />* 根据指定属性创建连接池实例.<br />*<br />* @param props 连接池属性<br />*/<br />private void createPools(Properties props) {<br />Enumeration propNames = props.propertyNames();<br />while (propNames.hasMoreElements()) {<br />String name = (String) propNames.nextElement();<br />if (name.endsWith(".url")) {<br />String poolName = name.substring(0, name.lastIndexOf("."));<br />String url = props.getProperty(poolName + ".url");<br />if (url == null) {<br />log("没有为连接池" + poolName + "指定URL");<br />continue;<br />}<br />String user = props.getProperty(poolName + ".user");<br />String password = props.getProperty(poolName + ".password");<br />String dbip = props.getProperty(poolName + ".db_ip", "192.168.96.1");<br />String dbport = props.getProperty(poolName + ".db_port", "1521");<br />String dbuid = props.getProperty(poolName + ".db_uid", "ORACLE9I");<br />String maxconn = props.getProperty(poolName + ".maxconn", "0");<br />//连接信息<br />String dbInfo = user + "/" + password + "@" + dbip + ":" + dbport + ":" + dbuid;<br />int max;<br />try {<br />max = Integer.valueOf(maxconn).intValue();<br />}<br />catch (NumberFormatException e) {<br />log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);<br />max = 0;<br />}<br />DBConnectionPool pool = new DBConnectionPool(poolName, url,dbInfo, max);<br />pools.put(poolName, pool);<br />log("成功创建连接池" + poolName);<br />}<br />}<br />}<br /><br />/**<br />* 读取属性完成初始化<br />*/<br />private void init() {<br />InputStream is = getClass().getResourceAsStream("db.properties");<br />Properties dbProps = new Properties();<br />try {<br />dbProps.load(is);<br />}<br />catch (Exception e) {<br />System.err.println("不能读取属性文件. " +<br />"请确保db.properties在CLASSPATH指定的路径中");<br />return;<br />}<br />String logFile = dbProps.getProperty("logfile", "newslog.txt");<br />try {<br />log = new PrintWriter(new FileWriter(logFile, true), true);<br />}<br />catch (IOException e) {<br />System.err.println("无法打开日志文件: " + logFile);<br />log = new PrintWriter(System.err);<br />}<br />loadDrivers(dbProps);<br />createPools(dbProps);<br />}<br /><br />/**<br />* 装载和注册所有JDBC驱动程序<br />*<br />* @param props 属性<br />*/<br />private void loadDrivers(Properties props) {<br />String driverClasses = props.getProperty("driver");<br />StringTokenizer st = new StringTokenizer(driverClasses);<br />while (st.hasMoreElements()) {<br />String driverClassName = st.nextToken().trim();<br />try {<br />Driver driver = (Driver)<br />Class.forName(driverClassName).newInstance();<br />DriverManager.registerDriver(driver);<br />drivers.addElement(driver);<br />log("成功注册JDBC驱动程序" + driverClassName);<br />}<br />catch (Exception e) {<br />log("无法注册JDBC驱动程序: " +<br />driverClassName + ", 错误: " + e);<br />}<br />}<br />}<br /><br />/**<br />* 将文本信息写入日志文件<br />*/<br />private void log(String msg) {<br />log.println(new Date() + ": " + msg);<br />}<br /><br />/**<br />* 将文本信息与异常写入日志文件<br />*/<br />private void log(Throwable e, String msg) {<br />log.println(new Date() + ": " + msg);<br />e.printStackTrace(log);<br />}<br /><br />/***************连接池类*************************************************/<br /><br />/**<br />* 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最<br />* 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.<br />*/<br />class DBConnectionPool {<br />private int checkedOut;<br />private Vector freeConnections = new Vector();<br />private int maxConn;<br />private String name;<br />private String URL;<br />private String dbInfo;<br /><br />/**<br />* 创建新的连接池<br />*<br />* @param name 连接池名字<br />* @param URL 数据库的JDBC URL<br />* @param dbInfo 数据库连接信息<br />* @param maxConn 此连接池允许建立的最大连接数<br />*/<br />public DBConnectionPool(String name, String URL, String dbInfo, int maxConn) {<br />this.name = name;<br />this.URL = URL;<br />this.dbInfo = dbInfo;<br />this.maxConn = maxConn;<br />}<br /><br />/**<br />* 将不再使用的连接返回给连接池<br />*<br />* @param con 客户程序释放的连接<br />*/<br />public synchronized void freeConnection(Connection con) {<br />// 将指定连接加入到向量末尾<br />freeConnections.addElement(con);<br />checkedOut--;<br />notifyAll();<br />}<br /><br />/**<br />* 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接<br />* 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,<br />* 然后递归调用自己以尝试新的可用连接.<br />*/<br />public synchronized Connection getConnection() {<br />Connection con = null;<br />if (freeConnections.size() &gt; 0) {<br />// 获取向量中第一个可用连接<br />con = (Connection) freeConnections.firstElement();<br />freeConnections.removeElementAt(0);<br />try {<br />if (con.isClosed()) {<br />log("从连接池" + name+"删除一个无效连接");<br />// 递归调用自己,尝试再次获取可用连接<br />con = getConnection();<br />}<br />}<br />catch (SQLException e) {<br />log("从连接池" + name+"删除一个无效连接");<br />// 递归调用自己,尝试再次获取可用连接<br />con = getConnection();<br />}<br />}<br />else if (maxConn == 0 || checkedOut &lt; maxConn) {<br />con = newConnection();<br />}<br />if (con != null) {<br />checkedOut++;<br />}<br />return con;<br />}<br /><br />/**<br />* 从连接池获取可用连接.可以指定客户程序能够等待的最长时间<br />* 参见前一个getConnection()方法.<br />*<br />* @param timeout 以毫秒计的等待时间限制<br />*/<br />public synchronized Connection getConnection(long timeout) {<br />long startTime = new Date().getTime();<br />Connection con;<br />while ((con = getConnection()) == null) {<br />try {<br />wait(timeout);<br />}<br />catch (InterruptedException e) {}<br />if ((new Date().getTime() - startTime) &gt;= timeout) {<br />// wait()返回的原因是超时<br />return null;<br />}<br />}<br />return con;<br />}<br /><br />/**<br />* 关闭所有连接<br />*/<br />public synchronized void release() {<br />Enumeration allConnections = freeConnections.elements();<br />while (allConnections.hasMoreElements()) {<br />Connection con = (Connection) allConnections.nextElement();<br />try {<br />con.close();<br />log("关闭连接池" + name+"中的一个连接");<br />}<br />catch (SQLException e) {<br />log(e, "无法关闭连接池" + name+"中的连接");<br />}<br />}<br />freeConnections.removeAllElements();<br />}<br /><br />/**<br />* 创建新的连接<br />*/<br />private Connection newConnection() {<br />Connection con = null; <br />try { <br />con = DriverManager.getConnection(URL+dbInfo); <br />log("连接池" + name+"创建一个新的连接"); <br />} <br />catch (SQLException e) { <br />log(e, "无法创建下列URL的连接: " + URL); <br />return null; <br />} <br />return con; <br />} <br /><br /><br />}<br />}<br /> <br /></p>
<img src ="http://www.blogjava.net/alexzhang1980/aggbug/37479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexzhang1980/" target="_blank">龙舌兰酒</a> 2006-03-26 15:46 <a href="http://www.blogjava.net/alexzhang1980/articles/37479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB应用中读取配置文件 (转载）</title><link>http://www.blogjava.net/alexzhang1980/articles/37478.html</link><dc:creator>龙舌兰酒</dc:creator><author>龙舌兰酒</author><pubDate>Sun, 26 Mar 2006 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/alexzhang1980/articles/37478.html</guid><wfw:comment>http://www.blogjava.net/alexzhang1980/comments/37478.html</wfw:comment><comments>http://www.blogjava.net/alexzhang1980/articles/37478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexzhang1980/comments/commentRss/37478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexzhang1980/services/trackbacks/37478.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">
				<font size="3">假设你的属性文件Proxool.properties中有数据库配置信息：<br />jdbc-0.proxool.alias=Access<br />jdbc-0.proxool.driver-class=sun.jdbc.odbc.JdbcOdbcDriver<br />jdbc-0.proxool.driver-url=jdbc:odbc:cwb</font>
		</h2>
		<p>jdbc-0.proxool.maximum-connection-count=20<br />jdbc-0.proxool.prototype-count=4</p>
		<p>jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE<br />jdbc-0.proxool.verbose=true<br />jdbc-0.proxool.statistics=10s,1m,1d<br />jdbc-0.proxool.statistics-log-level=ERROR</p>
		<p>你将这个属性文件放到你的WEB应用程序的web-info/classes目录下，在bean或类文件中访问这个属性文件<br />的传统方法莫过如此：<br /></p>
		<pre>package examples;
import java.io.*;
import java.util.*;

public class EnvironmentConfig {
	static EnvironmentConfig ec;//创建对象ec
	private static Hashtable register = new Hashtable();//静态对象初始化[在其它对象之前]

    private EnvironmentConfig() {
        super();
    }

    /**
     * 取得EnvironmentConfig的一个实例
     * @return ec
     */
    public static EnvironmentConfig getInstance() {
        if (ec==null)
            ec = new EnvironmentConfig();//创建EnvironmentConfig对象
        return ec;//返回EnvironmentConfig对象
    }

    /**
     * 读取配置文件
     * @param java.lang.String fileName
     * @return Properties
     */

    public Properties getProperties(String fileName) {//传递配置文件路径
        InputStream is=null;//定义输入流is
        Properties p = null;
        try{
            p = (Properties)register.get(fileName);//将fileName存于一个HashTable
            /**
             * 如果为空就尝试输入进文件
             */
            if (p==null) {
                try{
                    is = new FileInputStream(fileName);//创建输入流
                }
                catch(Exception e){
                    if (fileName.startsWith("/"))
                        //用getResourceAsStream()方法用于定位并打开外部文件。
                        is = EnvironmentConfig.class.getResourceAsStream(fileName);
                    else
                        is = EnvironmentConfig.class.getResourceAsStream("/"+fileName);
                }
                p = new Properties();
                p.load(is);//加载输入流
                register.put(fileName, p);//将其存放于HashTable缓存
                is.close();//关闭输入流
            }
		}
		catch(Exception e){
		     e.printStackTrace(System.out);
		}
        return p;//返回Properties对象
    }

    /**
     * 此处插入方法描述。
     * 创建日期：(2003-8-10 12:30:09)
     * @param fileName java.lang.String
     * @param strKey java.lang.String
     */

    public String getPropertyValue(String fileName, String strKey) {
        Properties p = getProperties(fileName);
		try{
            return (String)p.getProperty(strKey);
        }
        catch(Exception e){
            e.printStackTrace(System.out);
        }
        return null;
    }
}
</pre>
		<p>
		</p>
		<p>下面是jsp测试：testpro.jsp</p>
		<p>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="examples.EnvironmentConfig" %&gt;<br />&lt;%@ page import="java.util.*" %&gt; </p>
		<p>配置文件测试&lt;br&gt;<br />&lt;%<br />EnvironmentConfig ec=EnvironmentConfig.getInstance();<br />//Properties p=ec.getProperties("/Proxool.properties");<br />String s=ec.getPropertyValue("/Proxool.properties","jdbc-0.proxool.driver-class");<br />out.println("jdbc-0.proxool.driver-class="+s);</p>
		<p>
				<br />%&gt; <br /></p>
		<p>运行结果：</p>
		<p>配置文件测试<br />jdbc-0.proxool.driver-class=sun.jdbc.odbc.JdbcOdbcDriver </p>
		<p>在tomcat 5.5.x下测试成功。</p>
<img src ="http://www.blogjava.net/alexzhang1980/aggbug/37478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexzhang1980/" target="_blank">龙舌兰酒</a> 2006-03-26 15:45 <a href="http://www.blogjava.net/alexzhang1980/articles/37478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>