[size=4]原文地址:


[color=FF0000][url]http://www.591pic.com/read-htm-tid-43.html[/url][/color][/size]



[size=3]

06年的旧文,当时正在寺院里修行,现在贴出来凑数。



进入J2EE学习有一段时间了,B/S环境下,最大的兴趣就是搭建起自己的第一个WEB服务器并运行自己的网站。最近业余时间一直在做这个。胡子一大把,我深入学习技术的时候好象就会变懒,除了编程是彩色的,其他的都变灰了。以前做项目的时候也是这样,街上看见一美女,一点反应也没有,脑子里全是程序的结构。有点担心,这样下去可不好。

    原理:言归正传,如何用jsp或servlet连接操作数据库,这是基本的东西,不是今天要说的。在真正的WEB服务应用中,面对数量巨大的访问与连接,程序不能也无法满足于简单的功能实现,效率和稳定成为更被关注的因素。数据库连接池就是其中一项用来提高服务效率的技术。在对数据库操作的过程中,开始阶段连接数据库占用了其中绝大部分时间,每进行一次数据库操作,就需要进行一次新的连接。面对这个瓶颈,数据库连接池被提了出来。简言之,就是在WEB服务一开始运行的时候就与数据库建立若干连接,把这些服务由连接池进行管理。有用户请求时,分配一个连接出去供用户使用,用户使用完后将连接归还给连接池。这样省去了用户连接数据库的步骤,节省了很多时间。数据库连接池可以自己编写,写成一个类,在WEB服务器启动时运行。很多WEB服务端也提供了数据库连接池功能,只需进行简单的配置即可。网上有很多这方面的文章,可惜不是版本太老,就是抄来抄去抄的面目全非,我自己是被误导了N次后自己慢慢琢磨出来的,分享一下,绝对原版,肯定适用!下面以Tomcat5.5为例,说明连接池的配置与使用。

    Tomcat中配置连接池有两种方式,一种是通过admin管理界面配置,一种是修改xml配置文件来配置。二者实质是一样的,都是修改了xml文件的内容。前者使用非常简单,不过我推荐后者--直接修改xml文件。比用admin管理界面更可靠也能够了解底层运行原理。注意:本例是以最新的汤猫5.5说明,5.0或之前版本与5.5的配置是不同的。

    首先,需要给连接池命名,随便取,我在这里取"jdbc/myDBPool",取名时好象"jdbc/..."是个习惯性用法,不过还是随你。其次,要清楚数据库的的url和driver,这个很简单,在这里我用的是oracle数据库。"url=jdbc:oracle:thin:@localhost:1521:lostsky","lostsky"是我电脑上数据库的SID服务名,在服务里查看OracleService...,结尾的字符串就是SID。 "driver=oracle.jdbc.driver.OracleDriver",数据库驱动名称,没什么说的。接下来就开始修改xml文件了,总结了一下,主要就是修改以下三个位置的文件:

    1,\%catalina_home%\webapps\root\WEB-INF\web.xml        catalina_home是tomcat5.5的安装目录,这个是环境变量,自己安装tomcat5.5时就应该配好了。在<web-app></web-app>结点之间加入;
              <resource-ref>
              <description>Oracle DB Connection Pool</description>
              <res-ref-name>jdbc/myDBPool</res-ref-name>
              <res-type>javax.sql.DataSource</res-type>
              <res-auth>Container</res-auth>
              <res-sharing-scope>Shareable</res-sharing-scope>
              </resource-ref>     除了"jdbc/myDBPool"是你自己取的连接池名称,其他照填。

    2,\%catalina_home%\webapps\root\META-INF\context.xml         <context></context>结点之间加入;
              <ResourceLink
               global="jdbc/myDBPool"
               name="jdbc/myDBPool"
               type="javax.sql.DataSource"/>  除了"jdbc/myDBPool"是你自己取的连接池名称,其他照填。

    3,\%catalina_home%\conf\server.xml         <GlobalNamingResources></GlobalNamingResources>结点之间加入;
              <Resource
               name="jdbc/myoracle"
               type="javax.sql.DataSource"
               password="tiger"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               maxIdle="4"
               maxWait="5000"
               username="scott"
               url="jdbc:oracle:thin:@localhost:1521:LOSTSKY"
               maxActive="10"/>           这里大多数内容应该能看懂,我再解释一下:"name"是你取的连接池名字,"username"和"password"是连接数据库的用户名与密码,很熟悉吧:)  "driverClassName"是数据库驱动名称,"url"是连接数据库的地址,"maxActive"是最大活动连接数,通过这个参数控制连接池中,连接的数量;" maxIdle"是最大空闲连接数,是用来控制连接数量的,也就是你想池中有多少闲置的连接,要知道闲置的连接是占资源的。"maxWait"是超时数,ms为单位。" type"是系统参数,不要修改。

    好了,修改完后保存,然后就可以调用数据库连接池了。方便起见,举一个jsp文件使用连接池连接数据库的例子:   db.jsp

    <%@page import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*" contentType="text/html;charset=gb2312"%>
<html>
    <head>
       <title>DBPool</title>
    </head>
    <body>
<% 
   DataSource ds=null;
   Connection conn=null;
   Statement stmt=null;
   ResultSet rs=null;
   try{   
      Context initCtx=new InitialContext();     //从这里到"conn=ds.getConnection"是使用连接池的方法,需要自己多练习来记忆。
      Context ctx=(Context)initCtx.lookup("java:comp/env");
      ds=(DataSource)ctx.lookup("jdbc/myDBPool");
      conn=ds.getConnection();
      stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
      rs=stmt.executeQuery("select * from emp");
      while(rs.next()){
          String strName=rs.getString("ename");
          out.println(strName);
      }
   }catch(Exception e){
       String strException=e.getMessage();
       out.println("有异常!  "+strException);
   }finally{
       if(rs!=null){
           rs.close();
       }
       if(stmt!=null){
           stmt.close();
       }
       if(conn!=null){
           conn.close();
       }
   }
%>
    </body>
</html>


    实际上,真正的数据库连接池是放在servlet或javabean中随着WEB服务器一起启动的,jsp文件是不应该用来进行复杂的后台处理的。这里为了方便起见举个例子。    好了,把db.jsp放到root目录下,启动汤猫5.5,浏览器里输入"http://127.0.0.1:8080/db.jsp",当然,别忘了启动数据库。OK,熟悉的Oracle中scott用户的emp表的员工姓名应该都展示在你面前了。 鼓个掌...

    还有问题的话请留言,或QQ,email联系。


    严重鄙视看帖不回!  :)[/size]