﻿<?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-study-文章分类-jsp连接数据库大全</title><link>http://www.blogjava.net/xixidabao/category/10245.html</link><description>GROW WITH JAVA</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 05:05:50 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 05:05:50 GMT</pubDate><ttl>60</ttl><item><title>连接池的实现</title><link>http://www.blogjava.net/xixidabao/articles/48364.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Fri, 26 May 2006 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/48364.html</guid><description><![CDATA[<B>连接池的实现</B><BR><BR>　　1、连接池模型<BR><BR>　　本文讨论的连接池包括一个连接池类（DBConnectionPool）和一个连接池管理类（DBConnetionPoolManager）。连接池类是对某一数据库所有连接的“缓冲池”，主要实现以下功能：①从连接池获取或创建可用连接；②使用完毕之后，把连接返还给连接池；③在系统关闭前，断开所有连接并释放连接占用的系统资源；④还能够处理无效连接（原来登记为可用的连接，由于某种原因不再可用，如超时，通讯问题），并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。<BR><BR>　　连接池管理类是连接池类的外覆类（wrapper）,符合单例模式，即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理，具有以下功能：①装载并注册特定数据库的JDBC驱动程序；②根据属性文件给定的信息，创建连接池对象；③为方便管理多个连接池对象，为每一个连接池对象取一个名字，实现连接池名字与其实例之间的映射；④跟踪客户使用连接情况，以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理，如系统需要连接不同的数据库，或连接相同的数据库但由于安全性问题，需要不同的用户使用不同的名称和密码。<BR><BR>　　2、连接池实现<BR><BR>　　下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口：<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>public class DBConnectionPool implements TimerListener{<BR>private int checkedOut;//已被分配出去的连接数<BR>private ArrayList freeConnections = new ArrayList();//容器，空闲池，根据//创建时间顺序存放已创建但尚未分配出去的连接<BR>private int minConn;//连接池里连接的最小数量<BR>private int maxConn;//连接池里允许存在的最大连接数<BR>private String name;//为这个连接池取个名字，方便管理<BR>private String password;//连接数据库时需要的密码<BR>private String url;//所要创建连接的数据库的地址<BR>private String user;//连接数据库时需要的用户名<BR>public Timer timer;//定时器<BR>public DBConnectionPool(String name, String URL, String user, String <BR>password, int maxConn)//公开的构造函数<BR>public synchronized void freeConnection(Connection con) //使用完毕之后，//把连接返还给空闲池<BR>public synchronized Connection getConnection(long timeout)//得到一个连接，//timeout是等待时间<BR>public synchronized void release()//断开所有连接，释放占用的系统资源<BR>private Connection newConnection()//新建一个数据库连接<BR>public synchronized void TimerEvent() //定时器事件处理函数<BR><BR>}<BR><BR>public class DBConnectionManager {<BR>static private DBConnectionManager instance;//连接池管理类的唯一实例<BR>static private int clients;//客户数量<BR>private ArrayList drivers = new ArrayList();//容器，存放数据库驱动程序<BR><BR>private HashMap pools = new HashMap ();//以name/value的形式存取连接池//对象的名字及连接池对象<BR>static synchronized public DBConnectionManager getInstance()//如果唯一的//实例instance已经创建，直接返回这个实例;否则，调用私有构造函数，创//建连接池管理类的唯一实例 <BR><BR>private DBConnectionManager()//私有构造函数,在其中调用初始化函数init()<BR><BR>public void freeConnection(String name, Connection con)// 释放一个连接，//name是一个连接池对象的名字<BR><BR>public Connection getConnection(String name)//从名字为name的连接池对象//中得到一个连接<BR><BR>public Connection getConnection(String name, long time)//从名字为name<BR><BR>//的连接池对象中取得一个连接，time是等待时间<BR><BR>public synchronized void release()//释放所有资源<BR><BR>private void createPools(Properties props)//根据属性文件提供的信息，创建//一个或多个连接池<BR><BR>private void init()//初始化连接池管理类的唯一实例，由私有构造函数调用<BR><BR>private void loadDrivers(Properties props)//装载数据库驱动程序<BR><BR>} </TD></TR></TBODY></TABLE><BR>　　3、连接池使用<BR><BR>　　上面所实现的连接池在程序开发时如何应用到系统中呢？下面以Servlet为例说明连接池的使用。<BR><BR>　　Servlet的生命周期是：在开始建立servlet时，调用其初始化（init）方法。之后每个用户请求都导致一个调用前面建立的实例的service方法的线程。最后，当服务器决定卸载一个servlet时，它首先调用该servlet的 destroy方法。<BR><BR>　　根据servlet的特点，我们可以在初始化函数中生成连接池管理类的唯一实例（其中包括创建一个或多个连接池）。如：<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>public void init() throws ServletException<BR>{<BR>　connMgr = DBConnectionManager.getInstance(); <BR>} </TD></TR></TBODY></TABLE><BR>　　然后就可以在service方法中通过连接池名称使用连接池，执行数据库操作。最后在destroy方法中释放占用的系统资源，如： <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
<TBODY>
<TR>
<TD>public void destroy() { <BR>　connMgr.release(); super.destroy(); <BR>}</TD></TR></TBODY></TABLE><BR>　　<B>结束语</B><BR><BR>　　在使用JDBC进行与数据库有关的应用开发中，数据库连接的管理是一个难点。很多时候，连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。对于众多用户访问的Web应用，采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。本文阐述了使用JDBC访问数据库的技术﹑讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式，为提高系统的整体性能，在此基础上还可以进行很多有意义的扩展。<BR><BR>
<TABLE borderColor=#000000 cellSpacing=4 width="90%" align=center border=1>
<TBODY>
<TR>
<TD>
<DIV align=center><B>编辑推荐：<A href="http://www.yesky.com/SoftChannel/72348977504190464/20041019/1865943.shtml" target=_blank><FONT color=#cc3333>Java数据库接口JDBC入门基础讲座</FONT></A></B></DIV></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/xixidabao/aggbug/48364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-26 16:32 <a href="http://www.blogjava.net/xixidabao/articles/48364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用连接池提高Servlet访问数据库的效率</title><link>http://www.blogjava.net/xixidabao/articles/44289.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Mon, 01 May 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/44289.html</guid><description><![CDATA[<FONT id=font_word style="FONT-SIZE: 14px; FONT-FAMILY: 宋体, Verdana, Arial, Helvetica, sans-serif"><p><br>              Java Servlet作为首选的服务器端数据处理技术，正在迅速取代<a target="_blank" href="http://www.pccode.net" class="wordstyle">CGI</a>脚本。Servlet超越<a target="_blank" href="http://www.pccode.net" class="wordstyle">CGI</a>的优势之一在于，不仅多个请求可以共享公用资源，而且还可以在不同用户请求之间保留持续数据。本文介绍一种充分发挥该特色的实用技术，即数据库连接池。<br>            </p>              <p>一、实现连接池的意义</p>              <p>动态Web站点往往用数据库存储的信息生成Web页面，每一个页面请求导致一次数据库访问。连接数据库不仅要开销一定的通讯和内存资源，还必须完成用户验证、安全上下文配置这类任务，因而往往成为最为耗时的操作。当然，实际的连接时间开销千变万化，但1到2秒延迟并非不常见。如果某个基于数据库的Web应用只需建立一次初始连<br>                接，不同页面请求能够共享同一连接，就能获得显著的性能改善。<br>                Servlet是一个Java类。Servlet引擎（它可能是Web服务<a target="_blank" href="http://www.pccode.net" class="wordstyle">软件</a>的一部分，也可能是一个独立的附加模块）在系统启动或Servlet第一次被请求时将该类装入Java虚拟机并创建它的一个实例。不同用户请求由同一Servlet实例的多个独立线程处理。那些要<br>                求在不同请求之间持续有效的数据既可以用Servlet的实例变量来保存，也可以保存在独立的辅助对象中。<br>                用JDBC访问数据库首先要创建与数据库之间的连接，获得一个连接对象（Connection），由连接对象提供执行SQL语句的方法。<br>                本文介绍的数据库连接池包括一个管理类DBConnectionManager，负责提供与多个连接池对象（DBConnectionPool类）之间的接口。每一个连接池对象管理一组JDBC连接对象，每一个连接对象可以被任意数量的Servlet共享。<br>                类DBConnectionPool提供以下功能：</p>              <p>1) 从连接池获取（或创建）可用连接。<br>                2) 把连接返回给连接池。<br>                3) 在系统关闭时释放所有资源，关闭所有连接。</p>              <p>此外， DBConnectionPool类还能够处理无效连接（原来登记为可用的连接，由于某种原因不再可用，如超时，通讯问题）<br>                ，并能够限制连接池中的连接总数不超过某个预定值。<br>                管理类DBConnectionManager用于管理多个连接池对象，它提供以下功能：</p>              <p>1) 装载和注册JDBC驱动程序。<br>                2) 根据在属性文件中定义的属性创建连接池对象。<br>                3) 实现连接池名字与其实例之间的映射。<br>                4) 跟踪客户程序对连接池的引用，保证在最后一个客户程序结束时安全地关闭所有连接池。</p>              <p>本文余下部分将详细说明这两个类，最后给出一个示例演示Servlet使用连接池的一般过程。<br>              </p>              <p>二、具体实现</p>              <p>DBConnectionManager.java程序清单如下：</p>              <p>001 import java.io.*;<br>                002 import java.sql.*;<br>                003 import java.util.*;<br>                004 import java.util.Date;<br>                005<br>                006 /**<br>                007 * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接<br>                008 * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.<br>                009 */<br>                010 public class DBConnectionManager &#123;<br>                011 static private DBConnectionManager instance; // 唯一实例<br>                012 static private int clients;<br>                013<br>                014 private Vector drivers = new Vector();<br>                015 private PrintWriter log;<br>                016 private Hashtable pools = new Hashtable();<br>                017<br>                018 /**<br>                019 * 返回唯一实例.如果是第一次调用此方法,则创建实例<br>                020 *<br>                021 * @return DBConnectionManager 唯一实例<br>                022 */<br>                023 static synchronized public DBConnectionManager getInstance() &#123;<br>                024 if (instance == null) &#123;<br>                025 instance = new DBConnectionManager();<br>                026 &#125;<br>                027 clients++;<br>                028 return instance;<br>                029 &#125;<br>                030<br>                031 /**<br>                032 * 建构函数私有以防止其它对象创建本类实例<br>                033 */<br>                034 private DBConnectionManager() &#123;<br>                035 init();<br>                036 &#125;<br>                037<br>                038 /**<br>                039 * 将连接对象返回给由名字指定的连接池<br>                040 *<br>                041 * @param name 在属性文件中定义的连接池名字<br>                042 * @param con 连接对象<br>                043 */<br>                044 public void freeConnection(String name, Connection con) &#123;<br>                045 DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br>                046 if (pool != null) &#123;<br>                047 pool.freeConnection(con);<br>                048 &#125;<br>                049 &#125;<br>                050<br>                051 /**<br>                052 * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数<br>                053 * 限制,则创建并返回新连接<br>                054 *<br>                055 * @param name 在属性文件中定义的连接池名字<br>                056 * @return Connection 可用连接或null<br>                057 */<br>                058 public Connection getConnection(String name) &#123;<br>                059 DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br>                060 if (pool != null) &#123;<br>                061 return pool.getConnection();<br>                062 &#125;<br>                063 return null;<br>                064 &#125;<br>                065<br>                066 /**<br>                067 * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,<br>                068 * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.<br>                069 *<br>                070 * @param name 连接池名字<br>                071 * @param time 以毫秒计的等待时间<br>                072 * @return Connection 可用连接或null<br>                073 */<br>                074 public Connection getConnection(String name, long time) &#123;<br>                075 DBConnectionPool pool = (DBConnectionPool) pools.get(name);<br>                076 if (pool != null) &#123;<br>                077 return pool.getConnection(time);<br>                078 &#125;<br>                079 return null;<br>                080 &#125;<br>                081<br>                082 /**<br>                083 * 关闭所有连接,撤销驱动程序的注册<br>                084 */<br>                085 public synchronized void release() &#123;<br>                086 // 等待直到最后一个客户程序调用<br>                087 if (--clients != 0) &#123;<br>                088 return;<br>                089 &#125;<br>                090<br>                091 Enumeration allPools = pools.elements();<br>                092 while (allPools.hasMoreElements()) &#123;<br>                093 DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();<br>                094 pool.release();<br>                095 &#125;<br>                096 Enumeration allDrivers = drivers.elements();<br>                097 while (allDrivers.hasMoreElements()) &#123;<br>                098 Driver driver = (Driver) allDrivers.nextElement();<br>                099 try &#123;<br>                100 DriverManager.deregisterDriver(driver);<br>                101 log(&quot;撤销JDBC驱动程序 &quot; + driver.getClass().getName()+&quot;的注册&quot;);<br>                102 &#125;<br>                103 catch (SQLException e) &#123;<br>                104 log(e, &quot;无法撤销下列JDBC驱动程序的注册: &quot; + driver.getClass().getName());<br>                105 &#125;<br>                106 &#125;<br>                107 &#125;<br>                108<br>                109 /**<br>                110 * 根据指定属性创建连接池实例.<br>                111 *<br>                112 * @param props 连接池属性<br>                113 */<br>                114 private void createPools(Properties props) &#123;<br>                115 Enumeration propNames = props.propertyNames();<br>                116 while (propNames.hasMoreElements()) &#123;<br>                117 String name = (String) propNames.nextElement();<br>                118 if (name.endsWith(&quot;.url&quot;)) &#123;<br>                119 String poolName = name.substring(0, name.lastIndexOf(&quot;.&quot;));<br>                120 String url = props.getProperty(poolName + &quot;.url&quot;);<br>                121 if (url == null) &#123;<br>                122 log(&quot;没有为连接池&quot; + poolName + &quot;指定URL&quot;);<br>                123 continue;<br>                124 &#125;<br>                125 String user = props.getProperty(poolName + &quot;.user&quot;);<br>                126 String password = props.getProperty(poolName + &quot;.password&quot;);<br>                127 String maxconn = props.getProperty(poolName + &quot;.maxconn&quot;, &quot;0&quot;);<br>                128 int max;<br>                129 try &#123;<br>                130 max = Integer.valueOf(maxconn).intValue();<br>                131 &#125;<br>                132 catch (NumberFormatException e) &#123;<br>                133 log(&quot;错误的最大连接数限制: &quot; + maxconn + &quot; .连接池: &quot; + poolName);<br>                134 max = 0;<br>                135 &#125;<br>                136 DBConnectionPool pool =<br>                137 new DBConnectionPool(poolName, url, user, password, max);<br>                138 pools.put(poolName, pool);<br>                139 log(&quot;成功创建连接池&quot; + poolName);<br>                140 &#125;<br>                141 &#125;<br>                142 &#125;<br>                143<br>                144 /**<br>                145 * 读取属性完成初始化<br>                146 */<br>                147 private void init() &#123;<br>                148 InputStream is = getClass().getResourceAsStream(&quot;/db.properties&quot;);<br>                149 Properties dbProps = new Properties();<br>                150 try &#123;<br>                151 dbProps.load(is);<br>                152 &#125;<br>                153 catch (Exception e) &#123;<br>                154 System.err.println(&quot;不能读取属性文件. &quot; +<br>                155 &quot;请确保db.properties在CLASSPATH指定的路径中&quot;);<br>                156 return;<br>                157 &#125;<br>                158 String logFile = dbProps.getProperty(&quot;logfile&quot;, &quot;DBConnectionManager.log&quot;);<br>                159 try &#123;<br>                160 log = new PrintWriter(new FileWriter(logFile, true), true);<br>                161 &#125;<br>                162 catch (IOException e) &#123;<br>                163 System.err.println(&quot;无法打开日志文件: &quot; + logFile);<br>                164 log = new PrintWriter(System.err);<br>                165 &#125;<br>                166 loadDrivers(dbProps);<br>                167 createPools(dbProps);<br>                168 &#125;<br>                169<br>                170 /**<br>                171 * 装载和注册所有JDBC驱动程序<br>                172 *<br>                173 * @param props 属性<br>                174 */<br>                175 private void loadDrivers(Properties props) &#123;<br>                176 String driverClasses = props.getProperty(&quot;drivers&quot;);<br>                177 StringTokenizer st = new StringTokenizer(driverClasses);<br>                178 while (st.hasMoreElements()) &#123;<br>                179 String driverClassName = st.nextToken().trim();<br>                180 try &#123;<br>                181 Driver driver = (Driver)<br>                182 Class.forName(driverClassName).newInstance();<br>                183 DriverManager.registerDriver(driver);<br>                184 drivers.addElement(driver);<br>                185 log(&quot;成功注册JDBC驱动程序&quot; + driverClassName);<br>                186 &#125;<br>                187 catch (Exception e) &#123;<br>                188 log(&quot;无法注册JDBC驱动程序: &quot; +<br>                189 driverClassName + &quot;, 错误: &quot; + e);<br>                190 &#125;<br>                191 &#125;<br>                192 &#125;<br>                193<br>                194 /**<br>                195 * 将文本信息写入日志文件<br>                196 */<br>                197 private void log(String msg) &#123;<br>                198 log.println(new Date() + &quot;: &quot; + msg);<br>                199 &#125;<br>                200<br>                201 /**<br>                202 * 将文本信息与异常写入日志文件<br>                203 */<br>                204 private void log(Throwable e, String msg) &#123;<br>                205 log.println(new Date() + &quot;: &quot; + msg);<br>                206 e.printStackTrace(log);<br>                207 &#125;<br>                208<br>                209 /**<br>                210 * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最<br>                211 * 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.<br>                212 */<br>                213 class DBConnectionPool &#123;<br>                214 private int checkedOut;<br>                215 private Vector freeConnections = new Vector();<br>                216 private int maxConn;<br>                217 private String name;<br>                218 private String password;<br>                219 private String URL;<br>                220 private String user;<br>                221<br>                222 /**<br>                223 * 创建新的连接池<br>                224 *<br>                225 * @param name 连接池名字<br>                226 * @param URL 数据库的JDBC URL<br>                227 * @param user 数据库帐号,或 null<br>                228 * @param password 密码,或 null<br>                229 * @param maxConn 此连接池允许建立的最大连接数<br>                230 */<br>                231 public DBConnectionPool(String name, String URL, String user, String password,<br>                232 int maxConn) &#123;<br>                233 this.name = name;<br>                234 this.URL = URL;<br>                235 this.user = user;<br>                236 this.password = password;<br>                237 this.maxConn = maxConn;<br>                238 &#125;<br>                239<br>                240 /**<br>                241 * 将不再使用的连接返回给连接池<br>                242 *<br>                243 * @param con 客户程序释放的连接<br>                244 */<br>                245 public synchronized void freeConnection(Connection con) &#123;<br>                246 // 将指定连接加入到向量末尾<br>                247 freeConnections.addElement(con);<br>                248 checkedOut--;<br>                249 notifyAll();<br>                250 &#125;<br>                251<br>                252 /**<br>                253 * 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接<br>                254 * 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,<br>                255 * 然后递归调用自己以尝试新的可用连接.<br>                256 */<br>                257 public synchronized Connection getConnection() &#123;<br>                258 Connection con = null;<br>                259 if (freeConnections.size() &gt; 0) &#123;<br>                260 // 获取向量中第一个可用连接<br>                261 con = (Connection) freeConnections.firstElement();<br>                262 freeConnections.removeElementAt(0);<br>                263 try &#123;<br>                264 if (con.isClosed()) &#123;<br>                265 log(&quot;从连接池&quot; + name+&quot;删除一个无效连接&quot;);<br>                266 // 递归调用自己,尝试再次获取可用连接<br>                267 con = getConnection();<br>                268 &#125;<br>                269 &#125;<br>                270 catch (SQLException e) &#123;<br>                271 log(&quot;从连接池&quot; + name+&quot;删除一个无效连接&quot;);<br>                272 // 递归调用自己,尝试再次获取可用连接<br>                273 con = getConnection();<br>                274 &#125;<br>                275 &#125;<br>                276 else if (maxConn == 0 || checkedOut &lt; maxConn) &#123;<br>                277 con = newConnection();<br>                278 &#125;<br>                279 if (con != null) &#123;<br>                280 checkedOut++;<br>                281 &#125;<br>                282 return con;<br>                283 &#125;<br>                284<br>                285 /**<br>                286 * 从连接池获取可用连接.可以指定客户程序能够等待的最长时间<br>                287 * 参见前一个getConnection()方法.<br>                288 *<br>                289 * @param timeout 以毫秒计的等待时间限制<br>                290 */<br>                291 public synchronized Connection getConnection(long timeout) &#123;<br>                292 long startTime = new Date().getTime();<br>                293 Connection con;<br>                294 while ((con = getConnection()) == null) &#123;<br>                295 try &#123;<br>                296 wait(timeout);<br>                297 &#125;<br>                298 catch (InterruptedException e) &#123;&#125;<br>                299 if ((new Date().getTime() - startTime) &gt;= timeout) &#123;<br>                300 // wait()返回的原因是超时<br>                301 return null;<br>                302 &#125;<br>                303 &#125;<br>                304 return con;<br>                305 &#125;<br>                306<br>                307 /**<br>                308 * 关闭所有连接<br>                309 */<br>                310 public synchronized void release() &#123;<br>                311 Enumeration allConnections = freeConnections.elements();<br>                312 while (allConnections.hasMoreElements()) &#123;<br>                313 Connection con = (Connection) allConnections.nextElement();<br>                314 try &#123;<br>                315 con.close();<br>                316 log(&quot;关闭连接池&quot; + name+&quot;中的一个连接&quot;);<br>                317 &#125;<br>                318 catch (SQLException e) &#123;<br>                319 log(e, &quot;无法关闭连接池&quot; + name+&quot;中的连接&quot;);<br>                320 &#125;<br>                321 &#125;<br>                322 freeConnections.removeAllElements();<br>                323 &#125;<br>                324<br>                325 /**<br>                326 * 创建新的连接<br>                327 */<br>                328 private Connection newConnection() &#123;<br>                329 Connection con = null;<br>                330 try &#123;<br>                331 if (user == null) &#123;<br>                332 con = DriverManager.getConnection(URL);<br>                333 &#125;<br>                334 else &#123;<br>                335 con = DriverManager.getConnection(URL, user, password);<br>                336 &#125;<br>                337 log(&quot;连接池&quot; + name+&quot;创建一个新的连接&quot;);<br>                338 &#125;<br>                339 catch (SQLException e) &#123;<br>                340 log(e, &quot;无法创建下列URL的连接: &quot; + URL);<br>                341 return null;<br>                342 &#125;<br>                343 return con;<br>                344 &#125;<br>                345 &#125;<br>                346 &#125;</p>              三、类DBConnectionPool说明              <p>该类在209至345行实现，它表示指向某个数据库的连接池。数据库由JDBC URL标识。一个JDBC URL由三部分组成：协议标识（总是jdbc），驱动程序标识（如 odbc、idb、oracle等），数据库标识（其格式依赖于驱动程序）。例如，jdbc:odbc:de<br>                mo，即是一个指向demo数据库的JDBC URL，而且访问该数据库要使用JDBC-ODBC驱动程序。每个连接池都有一个供客户程序使用的名字以及可选的用户帐号、密码、最大连接数限制。如果Web应用程序所支持的某些数据库操作可以被所有用户执行，而其它一些操作应由特别许可的用户执行，则可以为两类操作分别定义连接池，两个连接池使用相同的JDBC URL，但使用不同的帐号和密码。<br>                类DBConnectionPool的建构函数需要上述所有数据作为其参数。如222至238行所示，这些数据被保存为它的实例变量：<br>                如252至283行、285至305行所示， 客户程序可以使用DBConnectionPool类提供的两个方法获取可用连接。两者的共同之处在于：如连接池中存在可用连接，则直接返回，否则创建新的连接并返回。如果没有可用连接且已有连接总数等于最大限制<br>                数，第一个方法将直接返回null，而第二个方法将等待直到有可用连接为止。<br>                所有的可用连接对象均登记在名为freeConnections的向量（Vector）中。如果向量中有多于一个的连接，getConnection()总是选取第一个。同时，由于新的可用连接总是从尾部加入向量，从而使得数据库连接由于长时间闲置而被关闭的风险减低到最小程度。<br>                第一个getConnection()在返回可用连接给客户程序之前，调用了isClosed()方法验证连接仍旧有效。如果该连接被关闭或触发异常，getConnection()递归地调用自己以尝试获取另外的可用连接。如果在向量freeConnections中不存在任何可用连<br>                接，getConnection()方法检查是否已经指定最大连接数限制。如已经指定，则检查当前连接数是否已经到达极限。此处maxConn为0表示没有限制。如果没有指定最大连接数限制或当前连接数小于该值，该方法尝试创建新的连接。如创建成功，则增加已使用连接的计数并返回，否则返回空值。<br>                如325至345行所示，创建新连接由newConnection()方法实现。创建过程与是否已经指定数据库帐号、密码有关。<br>                JDBC的DriverManager类提供多个getConnection()方法，这些方法要用到JDBC URL与其它一些参数，如用户帐号和密码等。<br>                DriverManager将使用指定的JDBC URL确定适合于目标数据库的驱动程序及建立连接。<br>                在285至305行实现的第二个getConnection()方法需要一个以毫秒为单位的时间参数，该参数表示客户程序能够等待的最长时间。建立连接的具体操作仍旧由第一个getConnection()方法实现。<br>                该方法执行时先将startTime初始化为当前时间。在while循环中尝试获得一个连接。如果失败，则以给定的时间值为参数调用wait()。wait()的返回可能是由于其它线程调用notify()或notifyAll()，也可能是由于预定时间已到。为找出wait()返回的真正原因，程序用当前时间减开始时间（startTime），如差值大于预定时间则返回空值，否则再次调用getConnection()。<br>                把空闲的连接登记到连接池由240至250行的freeConnection()方法实现，它的参数为返回给连接池的连接对象。该对象被加入到freeConnections向量的末尾，然后减少已使用连接计数。调用notifyAll()是为了通知其它正在等待可用连接的线程。<br>                许多Servlet引擎为实现安全关闭提供多种方法。数据库连接池需要知道该事件以保证所有连接能够正常关闭。DBConnectionManager类负协调整个关闭过程，但关闭连接池中所有连接的任务则由DBConnectionPool类负责。在307至323行实现的release()方法供DBConnectionManager调用。该方法遍历freeConnections向量并关闭所有连接，然后从向量中删除这些连接。<br>              </p>              <p>四、类DBConnectionManager 说明</p>              <p>该类只能创建一个实例，其它对象能够调用其静态方法（也称为类方法）获得该唯一实例的引用。如031至036行所示，DBConnectionManager类的建构函数是私有的，这是为了避免其它对象创建该类的实例。<br>                DBConnectionManager类的客户程序可以调用getInstance()方法获得对该类唯一实例的引用。如018至029行所示，类的唯一实例在getInstance()方法第一次被调用期间创建，此后其引用就一直保存在静态变量instance中。每次调用getInstance()<br>                都增加一个DBConnectionManager的客户程序计数。即，该计数代表引用DBConnectionManager唯一实例的客户程序总数，它将被用于控制连接池的关闭操作。<br>                该类实例的初始化工作由146至168行之间的私有方法init()完成。其中 getResourceAsStream()方法用于定位并打开外部文件。外部文件的定位方法依赖于类装载器的实现。标准的本地类装载器查找操作总是开始于类文件所在路径，也能够搜索CLASSPATH中声明的路径。db.properties是一个属性文件，它包含定义连接池的键-值对。可供定义的公用属性如下：</p>              <p>drivers 以空格分隔的JDBC驱动程序类列表<br>                logfile 日志文件的绝对路径</p>              <p>其它的属性和特定连接池相关，其属性名字前应加上连接池名字：</p>              <p>&lt;poolname&gt;.url 数据库的 JDBC URL <br>              &lt;poolname&gt;.maxconn 允许建立的最大连接数，0表示没有限制 <br>              &lt;poolname&gt;.user 用于该连接池的数据库帐号<br>              &lt;poolname&gt;.password 相应的密码</p>              <p>其中url属性是必需的，而其它属性则是可选的。数据库帐号和密码必须合法。用于Windows平台的db.properties文件示例<br>                如下：</p>              <p>drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver<br>                logfile=D:\\user\\src\\java\\DBConnectionManager\\log.txt</p>              <p>idb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prp<br>                idb.maxconn=2</p>              <p>access.url=jdbc:odbc:demo<br>                access.user=demo<br>                access.password=demopw</p>              <p>注意在Windows路径中的反斜杠必须输入2个，这是由于属性文件中的反斜杠同时也是一个转义字符。<br>                init()方法在创建属性对象并读取db.properties文件之后，就开始检查logfile属性。如果属性文件中没有指定日志文件，则默认为当前目录下的DBConnectionManager.log文件。如日志文件无法使用，则向System.err输出日志记录。<br>                装载和注册所有在drivers属性中指定的JDBC驱动程序由170至192行之间的loadDrivers()方法实现。该方法先用StringTokenizer将drivers属性值分割为对应于驱动程序名称的字符串，然后依次装载这些类并创建其实例，最后在 DriverManager中注册<br>                该实例并把它加入到一个私有的向量drivers。向量drivers将用于关闭服务时从DriverManager取消所有JDBC 驱动程序的注册。<br>                init()方法的最后一个任务是调用私有方法createPools()创建连接池对象。如109至142行所示，createPools()方法先创建所有属性名字的枚举对象（即Enumeration对象，该对象可以想象为一个元素系列，逐次调用其nextElement()方法将顺序返<br>                回各元素），然后在其中搜索名字以“.url”结尾的属性。对于每一个符合条件的属性，先提取其连接池名字部分，进而读取所有属于该连接池的属性，最后创建连接池对象并把它保存在实例变量pools中。散列表（Hashtable类 ）pools实现连接<br>                池名字到连接池对象之间的映射，此处以连接池名字为键，连接池对象为值。<br>                为便于客户程序从指定连接池获得可用连接或将连接返回给连接池，类DBConnectionManager提供了方法getConnection()和freeConnection()。所有这些方法都要求在参数中指定连接池名字，具体的连接获取或返回操作则调用对应的连接池对象完成。它们的实现分别在051至064行、066至080行、038至049行。<br>                如082至107行所示，为实现连接池的安全关闭，DBConnectionManager提供了方法release()。在上面我们已经提到，所有DBConnectionManager的客户程序都应该调用静态方法getInstance()以获得该管理器的引用，此调用将增加客户程序计数。<br>                客户程序在关闭时调用release()可以递减该计数。当最后一个客户程序调用release()，递减后的引用计数为0，就可以调用各个连接池的release()方法关闭所有连接了。管理类release()方法最后的任务是撤销所有JDBC驱动程序的注册。<br>              </p>              <p>五、Servlet使用连接池示例</p>              <p>Servlet API所定义的Servlet生命周期类如：</p>              <p>1) 创建并初始化Servlet（init()方法）。<br>                2) 响应客户程序的服务请求（service()方法）。<br>                3) Servlet终止运行，释放所有资源（destroy()方法）。</p>              <p>本例演示连接池应用，上述关键步骤中的相关操作为：</p>              <p>1) 在init()，用实例变量connMgr 保存调用DBConnectionManager.getInstance()所返回的引用。<br>                2) 在service()，调用getConnection()，执行数据库操作，用freeConnection()将连接返回给连接池。<br>                3) 在destroy()，调用release()关闭所有连接，释放所有资源。</p>              <p>示例程序清单如下：</p>              <p>import java.io.*;<br>                import java.sql.*;<br>                import javax.servlet.*;<br>                import javax.servlet.http.*;<br>                public class TestServlet extends HttpServlet &#123;<br>                private DBConnectionManager connMgr;</p>              <p>public void init(ServletConfig conf) throws ServletException &#123;<br>                super.init(conf);<br>                connMgr = DBConnectionManager.getInstance();<br>                &#125;</p>              <p>public void service(HttpServletRequest req, HttpServletResponse res) <br>                throws IOException &#123;</p>              <p>res.setContentType(&quot;text/html&quot;);<br>                PrintWriter out = res.getWriter();<br>                Connection con = connMgr.getConnection(&quot;idb&quot;);<br>                if (con == null) &#123;<br>                out.println(&quot;不能获取数据库连接.&quot;);<br>                return;<br>                &#125;<br>                ResultSet rs = null;<br>                ResultSetMetaData md = null;<br>                Statement stmt = null;<br>                try &#123;<br>                stmt = con.createStatement();<br>                rs = stmt.executeQuery(&quot;SELECT * FROM EMPLOYEE&quot;);<br>                md = rs.getMetaData();<br>                out.println(&quot;&lt;H1&gt;职工数据&lt;/H1&gt;&quot;);<br>                while (rs.next()) &#123;<br>                out.println(&quot;&lt;BR&gt;&quot;);<br>                for (int i = 1; i &lt; md.getColumnCount(); i++) &#123;<br>                out.print(rs.getString(i) + &quot;, &quot;);<br>                &#125;<br>                &#125;<br>                stmt.close();<br>                rs.close();<br>                &#125;<br>                catch (SQLException e) &#123;<br>                e.printStackTrace(out);<br>                &#125;<br>                connMgr.freeConnection(&quot;idb&quot;, con);<br>                &#125;</p>              <p>public void destroy() &#123;<br>                connMgr.release();<br>                super.destroy();<br>                &#125;<br>                &#125;              </p></font>
<img src ="http://www.blogjava.net/xixidabao/aggbug/44289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-01 17:28 <a href="http://www.blogjava.net/xixidabao/articles/44289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个连接池的例子</title><link>http://www.blogjava.net/xixidabao/articles/44288.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Mon, 01 May 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/44288.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //文件：DbConnectionDefaultPool.java的第一部分//请注意看里面注明的一处需要修改连接参数的地方package com.qingtuo.db.pool;import java.sql.*;import java.util.*;import java.io.*;import java.text.*;import java.util.Date;/** * Default J...&nbsp;&nbsp;<a href='http://www.blogjava.net/xixidabao/articles/44288.html'>阅读全文</a><img src ="http://www.blogjava.net/xixidabao/aggbug/44288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-05-01 17:24 <a href="http://www.blogjava.net/xixidabao/articles/44288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>七、jsp连接PostgreSQL数据库 </title><link>http://www.blogjava.net/xixidabao/articles/41949.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41949.html</guid><description><![CDATA[
		<p>七、jsp连接PostgreSQL数据库 </p>
		<p>testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/soft" <br />//soft为你的数据库名 <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
		<p> </p>
		<p>文章出处： CSDN.NET </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:44 <a href="http://www.blogjava.net/xixidabao/articles/41949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>六、jsp连接MySQL数据库</title><link>http://www.blogjava.net/xixidabao/articles/41948.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41948.html</guid><description><![CDATA[
		<p>六、jsp连接MySQL数据库 </p>
		<p>testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//testDB为你的数据库名 <br />Connection conn= DriverManager.getConnection(url); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:43 <a href="http://www.blogjava.net/xixidabao/articles/41948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四、jsp连接Informix数据库</title><link>http://www.blogjava.net/xixidabao/articles/41944.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41944.html</guid><description><![CDATA[
		<p>四、jsp连接Informix数据库</p>
		<p>testinformix.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; <br />//testDB为你的数据库名 <br />Connection conn= DriverManager.getConnection(url); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:42 <a href="http://www.blogjava.net/xixidabao/articles/41944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五、jsp连接Sybase数据库</title><link>http://www.blogjava.net/xixidabao/articles/41945.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41945.html</guid><description><![CDATA[
		<p>五、jsp连接Sybase数据库 </p>
		<p>testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <br />//tsdata为你的数据库名 <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:42 <a href="http://www.blogjava.net/xixidabao/articles/41945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三、jsp连接DB2数据库 </title><link>http://www.blogjava.net/xixidabao/articles/41943.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41943.html</guid><description><![CDATA[
		<p>三、jsp连接DB2数据库 </p>
		<p>testdb2.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; <br />//sample为你的数据库名 <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:41 <a href="http://www.blogjava.net/xixidabao/articles/41943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二、jsp连接Sql Server7.0/2000数据库 </title><link>http://www.blogjava.net/xixidabao/articles/41941.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41941.html</guid><description><![CDATA[
		<p>JSP数据库连接大全 <br />------------------------------------------------------------------------------<br />二、jsp连接Sql Server7.0/2000数据库 </p>
		<p>
				<br />testsqlserver.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <br />//pubs为你的数据库的 <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:40 <a href="http://www.blogjava.net/xixidabao/articles/41941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一.连接Oracle8/8i/9i数据库</title><link>http://www.blogjava.net/xixidabao/articles/41938.html</link><dc:creator>JAVA之路</dc:creator><author>JAVA之路</author><pubDate>Wed, 19 Apr 2006 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/xixidabao/articles/41938.html</guid><description><![CDATA[
		<p>JSP数据库连接大全 <br />------------------------------------------------------------------------------<br />一、jsp连接Oracle8/8i/9i数据库（用thin模式） </p>
		<p>
				<br /> <br />testoracle.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />//orcl为你的数据库的SID <br />String user="scott"; <br />String password="tiger"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; </p>
		<p> </p>
<img src ="http://www.blogjava.net/xixidabao/aggbug/41938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixidabao/" target="_blank">JAVA之路</a> 2006-04-19 16:39 <a href="http://www.blogjava.net/xixidabao/articles/41938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>