1. 程式人生 > >JDBC連線池技術

JDBC連線池技術

一.連線池技術

(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)這個不用多數,效果看得見! 注:希望大家在轉載的時候註明出去!