Chinaunix首页 | 论坛 | 博客
  • 博客访问: 223917
  • 博文数量: 25
  • 博客积分: 1380
  • 博客等级: 中尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-02 18:19
文章分类

全部博文(25)

文章存档

2010年(4)

2009年(4)

2008年(17)

我的朋友

分类:

2008-06-22 00:13:08

1.将数据库驱动程序的JAR文件放在Tomcat common/lib 中;

2.在server.xml中设置数据源,以MySQL数据库为例,如下:

节点中加入,

     

      name="jdbc/DBPool"

      type="javax.sql.DataSource"

      password="root"

      driverClassName="com.mysql.jdbc.Driver"

      maxIdle="2"

      maxWait="5000"

      username="root"

      url="jdbc:mysql://127.0.0.1:3306/test"

      maxActive="4"/>

   属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;

            type,”javax.sql.DataSource;

            password,数据库用户密码;

            driveClassName,数据库驱动;

            maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连

                     接将被标记为不可用,然后被释放。设为0表示无限制。

            MaxActive,连接池的最大数据库连接数。设为0表示无限制。

            maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示

                     无限制。

3.在你的web应用程序的web.xml中设置数据源参考,如下:

  节点中加入,

 

    MySQL DB Connection Pool

    jdbc/DBPool

    javax.sql.DataSource

    Container

    Shareable

 

  子节点说明: description,描述信息;

               res-ref-name,参考数据源名字,同上一步的属性name

               res-type,资源类型,”javax.sql.DataSource”;

               res-auth,”Container”;

               res-sharing-scope,”Shareable”;

4.在web应用程序的context.xml中设置数据源链接,如下:

  节点中加入,

 

   name="jdbc/DBPool"

   type="javax.sql.DataSource"

   global="jdbc/DBPool"/>

   属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;

             type,同样取”javax.sql.DataSource”;

             global,同name值。

 

至此,设置完成,下面是如何使用数据库连接池。

1.建立一个连接池类,DBPool.java,用来创建连接池,代码如下:

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

 

public class DBPool {

    private static DataSource pool;

    static {

         Context env = null;

          try {

              env = (Context) new InitialContext().lookup("java:comp/env");

              pool = (DataSource)env.lookup("jdbc/DBPool");

              if(pool==null)

                  System.err.println("'DBPool' is an unknown DataSource");

               } catch(NamingException ne) {

                  ne.printStackTrace();

          }

      }

    public static DataSource getPool() {

        return pool;

    }

}

 

2.在要用到数据库操作的类或jsp页面中,用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池。

 

tomcat连接池的性能测试

 

配好了连接池之后,我对有连接池和没有连接池的数据库访问性能作了一下对比。
同样的连接条件:
连接300次,每次从表里读20String,显示在网页上。最后显示执行时间。
结果如下:
无连接池:平均8-9
有连接池:平均0.9-1.2
结果显示有连接池比无连接池要快10倍左右。而且当访问连接很频繁时连接池的优势更明显。

连接池代码:

Context ctx = new InitialContext();
if(ctx == null ) throw new Exception("No Context");
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mailfriends");
if (ds != null) {
       conn = ds.getConnection();      
}

无连接池代码:

Class.forName(this.driver);
conn=DriverManager.getConnection(url,user,password);

一样的JSP执行页代码:

<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%

long a=0,b=0;

java.util.Date date=new java.util.Date();
a=date.getTime();

for (int i=0;i<300;i++)
{
     try
     {                   
        Context initCtx = new InitialContext();

        if(initCtx==null)
           throw new Exception("
没有匹配的环境");

        Context ctx = (Context) initCtx.lookup("java:comp/env");
      
        //
获取连接池对象                   
        Object obj = (Object) ctx.lookup("jdbc/mailfriends");  
      
       //
类型转换
        javax.sql.DataSource ds = (javax.sql.DataSource)obj;
         
        if(ds==null)
           throw new Exception("
没有匹配数据库");  
    
        Connection conn = ds.getConnection();
      
        Statement stmt = conn.createStatement();                   
                             
        String strSql="select subject from plan";   //SQL
,要保证数据表里面有记录。
                      
        ResultSet rs=stmt.executeQuery(strSql);

        while(rs.next())
          {                     
           out.println(rs.getString("subject"));                          
          }
        rs.close();       //
关闭ResultSet  
        stmt.close();     //
关闭Statement
        conn.close();     //
将连接放回到连接池
      }

      catch(Exception ex)

      {    
          ex.printStackTrace();
          throw new SQLException("cannot get Connection pool."+ex);
      }
     
        java.util.Date date2=new java.util.Date();
   b=date2.getTime();
  
   out.println(date);
   out.println(date2);
   out.println(b-a);
}

%>

 

阅读(5950) | 评论(0) | 转发(0) |
0

上一篇:DB2数据库迁移_跨平台

下一篇:突然想听歌

给主人留下些什么吧!~~