一.连接池技术
(1)Java语言通过JDBC技术访问数据库的基本过程是:
1.加载数据库驱动程序;
2.通过JDBC建立数据库连接;
3.访问数据库,执行SQL语句;
4.断开数据库连接。
(2)在Web应用程序开发中,使用这种模式访问数据库时,存在很多问题,为了解决这些问题,可以采用数据库连接池技术。
连接池实际上是在一个集合对象中存储一定数量的数据库连接对象。当程序需要使用数据库连接时,请求从池中获取一个空闲的连接,
程序使用完毕后再把连接放回池中重用。连接池通过重用连接的方法,减少了创建连接的系统开销,能够明显提高系统的数据库访问效率。
(3)为解决上述问题可以使用连接池技术,连接池实际上是一个集合对象中存储一定数量的数据库连接对象。
(4)在JSP技术中,一般是通过数据源来使用连接池,一个数据对象会被注册为web服务器的一个JNDI资源,
应使用程序通过JDNI获取数据源对象,再通过数据源对象取得数据库连接,连接池为数据源提供物理连接。
二.使用方法
(1)用文本编辑器打开c:\tomcat\conf\context.xml文件,在<Context></Context>元素内部添加如下的数据源配置代码:
(2)应用程序通过数据源取得数据库连接的基本过程是:利用上下文对象,根据JNDI名取得一个数据源对象,通过数据源对象取得一个连接。
(3)JNDI的全称是Java命名和目录接口(java naming and directory interface)他是sun公司提供的java命名和目录访问接口。
主要方法如下:
1.javax.naming.Context
这个方法提供的lookup方法能在JNDI上下文中查找一个命名对象,返回一个object对象
2.javax.naming.InitialContext
3.javax.sql.DtaSource
数据源是一个和物理连鸡翅相关联的工厂类Factory 伟世通Datasource对象,必须为之指定连接池,连接池为JNDI数据源提供物理连接;
三.实例分析
(1)写两个JSP页面,一个从连接池中取得连接查询pubs数据库的titles表,另一个使用JDBC驱动程序获得连接查询pubs数据库的titles表,
每个JSP页面执行查询语句500次,并通过查询分析器记录下相关的连接信息,比较两种数据库连接方式的数据库访问效率。
操作步骤如下:
第1步:定义连接池和数据源。用文本编辑器打开c:\tomcat\conf\context.xml文件,在<Context></Context>元素内部添加配置代码(内容上述有介绍省去)
第2步:新建JSP页面,用连接池方式访问pubs/titles表500次。
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <%@page import="javax.sql.*,javax.naming.*"%> <% long beginTime=System.currentTimeMillis(); int n=500; ResultSet rs=null; Statement st=null; Connection con=null; for(int i=0;i<n;i++) { try { Context ctx=new InitialContext(); //获得一个上下文对象 DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/pubs"); //通过上下文对象在JNDI中查找指定名字的数据源 con=ds.getConnection();//通过数据源获得一个连接池 String sql="select title,type,price from titles "; st=con.createStatement(); rs=st.executeQuery(sql); while(rs.next()) { rs.getString("title"); rs.getString("type"); rs.getString("price"); } } catch(Exception e) { out.print(e.getMessage()); } finally { if(rs!=null) rs.close(); if(st!=null) st.close(); if(con!=null) con.close(); } } long endTime=System.currentTimeMillis(); out.print("用连接池作500次查询耗时:"+(endTime-beginTime)+"毫秒"); %> </body> </html>
第3步:新建一个名为exam623.jsp 的JSP页面,用JDBC驱动程序直接访问pubs/titles表500次。
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> </head> <body> <%@page import="javax.sql.*,javax.naming.*"%> <% long beginTime=System.currentTimeMillis(); int n=500; ResultSet rs=null; Statement st=null; Connection con=null; for(int i=0;i<n;i++) { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String url="jdbc:sqlserver://localhost:1433;databaseName=pubs;user=sa;password="; con = DriverManager.getConnection(url); String sql="select title,type,price from titles "; st=con.createStatement(); rs=st.executeQuery(sql); while(rs.next()) { rs.getString("title"); rs.getString("type"); rs.getString("price"); } rs.close(); st.close(); con.close(); } catch(Exception e) { out.print(e.getMessage()); } finally { if(rs!=null) rs.close(); if(st!=null) st.close(); if(con!=null) con.close(); } } long endTime=System.currentTimeMillis(); out.print("直接用JDBC连接作500次查询耗时:"+(endTime-beginTime)+"毫秒"); %> </body> </html>
(2)这个不用多数,效果看得见!
注:希望大家在转载的时候注明出去!