最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDBC數(shù)據(jù)源連接池配置及應(yīng)用

 更新時(shí)間:2016年06月14日 10:04:25   作者:kingxss  
這篇文章主要介紹JDBC建立數(shù)據(jù)庫(kù)連接的兩種方式,使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫(kù),效率更高,推薦使用,希望能給大家做一個(gè)參考。

使用JDBC建立數(shù)據(jù)庫(kù)連接的兩種方式:

1.在代碼中使用DriverManager獲得數(shù)據(jù)庫(kù)連接。這種方式效率低,并且其性能、可靠性和穩(wěn)定性隨著用戶(hù)訪(fǎng)問(wèn)量得增加逐漸下降。

2.使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫(kù),該方式其實(shí)質(zhì)就是在上述方法的基礎(chǔ)上增加了數(shù)據(jù)庫(kù)連接池,這種方式效率高。

數(shù)據(jù)源連接池的方式連接數(shù)據(jù)庫(kù)與在代碼中使用DriverManager獲得數(shù)據(jù)庫(kù)連接存在如下差別:

1)數(shù)據(jù)源連接池的方式連接數(shù)據(jù)庫(kù)是在程序中,通過(guò)向一個(gè)JNDI(Java Naming and  Directory Interface)服務(wù)器查詢(xún),即調(diào)用Context接口的lookup()方法,來(lái)得到DataSource對(duì)象,然后調(diào)用DataSource對(duì)象的getConnection()方法建立連接

2)為了能重復(fù)利用數(shù)據(jù)庫(kù)連接對(duì)象,提高對(duì)請(qǐng)求的響應(yīng)時(shí)間和服務(wù)器的性能,采用連接池技術(shù).連接池技術(shù)預(yù)先建立多個(gè)數(shù)據(jù)庫(kù)連接對(duì)象,然后將連接對(duì)象保存到連接池中,當(dāng)客戶(hù)請(qǐng)求到來(lái)時(shí),從池中取出一個(gè)連接對(duì)象為客戶(hù)服務(wù),當(dāng)請(qǐng)求完成時(shí),客戶(hù)程序調(diào)用close()方法,將連接對(duì)象放回池中.

3)在代碼中使用DriverManager獲得數(shù)據(jù)庫(kù)連接的方式中,客戶(hù)程序得到的連接對(duì)象是物理連接,調(diào)用連接對(duì)象的close()方法將關(guān)閉連接,而采用連接池技術(shù),客戶(hù)程序得到的連接對(duì)象是連接池中物理連接的一個(gè)句柄,調(diào)用連接對(duì)象的close()方法,物理連接并沒(méi)有關(guān)閉,數(shù)據(jù)源的實(shí)現(xiàn)只是刪除了客戶(hù)程序中的連接對(duì)象和池中的連接對(duì)象之間的聯(lián)系.

為了測(cè)試方便可以在數(shù)據(jù)庫(kù)(這里以mysql 5為例)中建立一個(gè)USER表:

CREATE TABLE `user` ( 
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
 `username` varchar(50) DEFAULT NULL, 
 `password` varchar(50) DEFAULT NULL, 
 `email` varchar(50) DEFAULT NULL, 
 PRIMARY KEY (`id`), 
);

導(dǎo)入數(shù)據(jù)庫(kù)的驅(qū)動(dòng)的jar包到tomcat的lib目錄下(這里以mysql5為例,所用到的jar包為:mysql-connector-java-5.0.8-bin.jar)。

1.在代碼中使用DriverManager獲得數(shù)據(jù)庫(kù)連接。這種方式效率低,并且其性能、可靠性和穩(wěn)定性隨著用戶(hù)訪(fǎng)問(wèn)量得增加逐漸下降。

oracle數(shù)據(jù)庫(kù)連接的Java代碼如下:

import java.sql.Connection; 
import java.sql.DriverManager; 
/** 
 * 獲取數(shù)據(jù)庫(kù)連接 
 */ 
public class DBConnection { 
  
 /** Oracle數(shù)據(jù)庫(kù)連接URL*/ 
 private final static String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; 
  
 /** Oracle數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)*/ 
 private final static String DB_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
  
 /** 數(shù)據(jù)庫(kù)用戶(hù)名*/ 
 private final static String DB_USERNAME = "root"; 
  
 /** 數(shù)據(jù)庫(kù)密碼*/ 
 private final static String DB_PASSWORD = "admin"; 
  
 /** 
  * 獲取數(shù)據(jù)庫(kù)連接 
  * @return 
  */ 
 public Connection getConnection(){ 
  /** 聲明Connection連接對(duì)象*/ 
  Connection conn = null; 
  try{ 
   /** 使用Class.forName()方法自動(dòng)創(chuàng)建這個(gè)驅(qū)動(dòng)程序的實(shí)例且自動(dòng)調(diào)用DriverManager來(lái)注冊(cè)它*/ 
   Class.forName(DB_DRIVER); 
   /** 通過(guò)DriverManager的getConnection()方法獲取數(shù)據(jù)庫(kù)連接*/ 
   conn = DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD); 
  }catch(Exception ex){ 
   ex.printStackTrace(); 
  } 
  return conn; 
 } 
  
 /** 
  * 關(guān)閉數(shù)據(jù)庫(kù)連接 
  * 
  * @param connect 
  */ 
 public void closeConnection(Connection conn){ 
  try{ 
   if(conn!=null){ 
    /** 判斷當(dāng)前連接連接對(duì)象如果沒(méi)有被關(guān)閉就調(diào)用關(guān)閉方法*/ 
    if(!conn.isClosed()){ 
     conn.close(); 
    } 
   } 
  }catch(Exception ex){ 
   ex.printStackTrace(); 
  } 
 } 
  
}

mysql數(shù)據(jù)庫(kù)連接的JSP代碼如下:

<%@page import="java.sql.*, com.mysql.jdbc.Driver"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<html> 
<body>  
 <% 
 //com.mysql.jdbc.Driver 
 Class.forName(Driver.class.getName()).newInstance(); 
 String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF8"; 
 String user = "root"; 
 String password = "123"; 
  
 Connection conn = DriverManager.getConnection(url, user, password); 
 Statement stmt = conn.createStatement(); 
  
 String sql = "select * from user"; 
 ResultSet rs = stmt.executeQuery(sql); 
  
 while(rs.next()) { 
  out.print("<br />" + "====================" + "<br />"); 
  out.print(rs.getLong("id") + " "); 
  out.print(rs.getString("username") + " "); 
  out.print(rs.getString("password") + " "); 
  out.print(rs.getString("email") + " "); 
 } 
 %> 
</body> 
</html> 

2.使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫(kù),該方式其實(shí)質(zhì)就是在上述方法的基礎(chǔ)上增加了數(shù)據(jù)庫(kù)連接池,這種方式效率高。

1)mysql數(shù)據(jù)庫(kù)數(shù)據(jù)源連接池的JSP代碼如下:

<%@page import="java.sql.*, javax.naming.*, javax.sql.DataSource"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<html> 
<body> 
 <% 
 Context initCtx = new InitialContext(); 
 DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/demoDB"); 
 Connection conn = ds.getConnection(); 
  
 Statement stmt = conn.createStatement(); 
  
 String sql = "select * from user"; 
 ResultSet rs = stmt.executeQuery(sql); 
  
 while(rs.next()) { 
  out.print("<br />" + "====================" + "<br />"); 
  out.print(rs.getLong("id") + " "); 
  out.print(rs.getString("username") + " "); 
  out.print(rs.getString("password") + " "); 
  out.print(rs.getString("email") + " "); 
 } 
 %> 
</body> 
</html> 

2) 添加如下代碼到tomcat的conf目錄下的server.xml中:

<Context> 
 <Resource name="jdbc/demoDB" auth="Container" 
 type="javax.sql.DataSource" 
 driverClassName="com.mysql.jdbc.Driver" 
 url="jdbc:mysql://localhost:3306/demo" 
 username="root" 
 password="123" 
 maxActive="50" 
 maxIdle="30" 
 maxWait="10000" /> 
</Context>

3)在web工程目錄下的web.xml的根節(jié)點(diǎn)下配置如下內(nèi)容:

<resource-ref> 
 <description>mysqlDB Connection</description> 
 <res-ref-name>jdbc/demoDB</res-ref-name> 
 <res-type>javax.sql.DataSource</res-type> 
 <res-auth>Container</res-auth> 
</resource-ref> 

完成上述步驟數(shù)據(jù)源的連接池配置已經(jīng)完成,但是為了提高項(xiàng)目的可移植性,最好將上述第二步的內(nèi)容放入到工程的META-INF目錄的context.xml中(這個(gè)文件需要自行建立):

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
  <Resource name="jdbc/demoDB" auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/demo" 
  username="root" 
  password="123" 
  maxActive="50" 
  maxIdle="30" 
  maxWait="10000" /> 
</Context> 

3.使用配置數(shù)據(jù)源的數(shù)據(jù)庫(kù)連接池時(shí)的數(shù)據(jù)庫(kù)操作工具類(lèi)

代碼如下:

package db.utils; 
 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.text.DateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import javax.naming.InitialContext; 
import javax.sql.DataSource; 
 
//import org.apache.log4j.Logger; 
 
/** 
 * 數(shù)據(jù)庫(kù)操作輔助類(lèi) 
 */ 
public class DbUtils { 
  
 //private static Logger logger = Logger.getLogger("DbUtils"); 
  
 /** 
  * 該語(yǔ)句必須是一個(gè) SQL INSERT、UPDATE 或 DELETE 語(yǔ)句 
  * @param sql 
  * @param paramList:參數(shù),與SQL語(yǔ)句中的占位符一一對(duì)應(yīng) 
  * @return 
  * @throws Exception 
  */ 
 public int execute(String sql, List<Object> paramList) throws Exception { 
  if(sql == null || sql.trim().equals("")) { 
   //logger.info("parameter is valid!"); 
  } 
 
  Connection conn = null; 
  PreparedStatement pstmt = null; 
  int result = 0; 
  try { 
   conn = getConnection(); 
   pstmt = DbUtils.getPreparedStatement(conn, sql); 
   setPreparedStatementParam(pstmt, paramList); 
   if(pstmt == null) { 
    return -1; 
   } 
   result = pstmt.executeUpdate(); 
  } catch (Exception e) { 
   //logger.info(e.getMessage()); 
   throw new Exception(e); 
  } finally { 
   closeStatement(pstmt); 
   closeConn(conn); 
  } 
 
  return result; 
 } 
  
 /** 
  * 將查詢(xún)數(shù)據(jù)庫(kù)獲得的結(jié)果集轉(zhuǎn)換為Map對(duì)象 
  * @param sql:查詢(xún)語(yǔ)句 
  * @param paramList:參數(shù) 
  * @return 
  */ 
 public List<Map<String, Object>> getQueryList(String sql, List<Object> paramList) throws Exception { 
  if(sql == null || sql.trim().equals("")) { 
   //logger.info("parameter is valid!"); 
   return null; 
  } 
 
  Connection conn = null; 
  PreparedStatement pstmt = null; 
  ResultSet rs = null; 
  List<Map<String, Object>> queryList = null; 
  try { 
   conn = getConnection(); 
   pstmt = DbUtils.getPreparedStatement(conn, sql); 
   setPreparedStatementParam(pstmt, paramList); 
   if(pstmt == null) { 
    return null; 
   } 
   rs = getResultSet(pstmt); 
   queryList = getQueryList(rs); 
  } catch (RuntimeException e) { 
   //logger.info(e.getMessage()); 
   System.out.println("parameter is valid!"); 
   throw new Exception(e); 
  } finally { 
   closeResultSet(rs); 
   closeStatement(pstmt); 
   closeConn(conn); 
  } 
  return queryList; 
 } 
  
 private void setPreparedStatementParam(PreparedStatement pstmt, List<Object> paramList) throws Exception { 
  if(pstmt == null || paramList == null || paramList.isEmpty()) { 
   return; 
  } 
  DateFormat df = DateFormat.getDateTimeInstance(); 
  for (int i = 0; i < paramList.size(); i++) { 
   if(paramList.get(i) instanceof Integer) { 
    int paramValue = ((Integer)paramList.get(i)).intValue(); 
    pstmt.setInt(i+1, paramValue); 
   } else if(paramList.get(i) instanceof Float) { 
    float paramValue = ((Float)paramList.get(i)).floatValue(); 
    pstmt.setFloat(i+1, paramValue); 
   } else if(paramList.get(i) instanceof Double) { 
    double paramValue = ((Double)paramList.get(i)).doubleValue(); 
    pstmt.setDouble(i+1, paramValue); 
   } else if(paramList.get(i) instanceof Date) { 
    pstmt.setString(i+1, df.format((Date)paramList.get(i))); 
   } else if(paramList.get(i) instanceof Long) { 
    long paramValue = ((Long)paramList.get(i)).longValue(); 
    pstmt.setLong(i+1, paramValue); 
   } else if(paramList.get(i) instanceof String) { 
    pstmt.setString(i+1, (String)paramList.get(i)); 
   } 
  } 
  return; 
 } 
  
 /** 
  * 獲得數(shù)據(jù)庫(kù)連接 
  * @return 
  * @throws Exception 
  */ 
 private Connection getConnection() throws Exception { 
  InitialContext cxt = new InitialContext(); 
  DataSource ds = (DataSource) cxt.lookup(jndiName); 
  if ( ds == null ) { 
   throw new Exception("Data source not found!"); 
  } 
   
  return ds.getConnection(); 
 } 
  
 private static PreparedStatement getPreparedStatement(Connection conn, String sql) throws Exception { 
  if(conn == null || sql == null || sql.trim().equals("")) { 
   return null; 
  } 
  PreparedStatement pstmt = conn.prepareStatement(sql.trim()); 
  return pstmt; 
 } 
  
 /** 
  * 獲得數(shù)據(jù)庫(kù)查詢(xún)結(jié)果集 
  * @param pstmt 
  * @return 
  * @throws Exception 
  */ 
 private ResultSet getResultSet(PreparedStatement pstmt) throws Exception { 
  if(pstmt == null) { 
   return null; 
  } 
  ResultSet rs = pstmt.executeQuery(); 
  return rs; 
 } 
  
 /** 
  * @param rs 
  * @return 
  * @throws Exception 
  */ 
 private List<Map<String, Object>> getQueryList(ResultSet rs) throws Exception { 
  if(rs == null) { 
   return null; 
  } 
  ResultSetMetaData rsMetaData = rs.getMetaData(); 
  int columnCount = rsMetaData.getColumnCount(); 
  List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); 
  while (rs.next()) { 
   Map<String, Object> dataMap = new HashMap<String, Object>(); 
   for (int i = 0; i < columnCount; i++) { 
    dataMap.put(rsMetaData.getColumnName(i+1), rs.getObject(i+1)); 
   } 
   dataList.add(dataMap); 
  } 
  return dataList; 
 } 
  
 /** 
  * 關(guān)閉數(shù)據(jù)庫(kù)連接 
  * @param conn 
  */ 
 private void closeConn(Connection conn) { 
  if(conn == null) { 
   return; 
  } 
  try { 
   conn.close(); 
  } catch (SQLException e) { 
   //logger.info(e.getMessage()); 
  } 
 } 
  
 /** 
  * 關(guān)閉 
  * @param stmt 
  */ 
 private void closeStatement(Statement stmt) { 
  if(stmt == null) { 
   return; 
  } 
  try { 
   stmt.close(); 
  } catch (SQLException e) { 
   //logger.info(e.getMessage()); 
  } 
 } 
  
 /** 
  * 關(guān)閉 
  * @param rs 
  */ 
 private void closeResultSet(ResultSet rs) { 
  if(rs == null) { 
   return; 
  } 
  try { 
   rs.close(); 
  } catch (SQLException e) { 
   //logger.info(e.getMessage()); 
  } 
 } 
  
  
 private String jndiName = "java:/comp/env/jdbc/demoDB"; 
 
 public void setJndiName(String jndiName) { 
  this.jndiName = jndiName; 
 } 
}

總結(jié):使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫(kù),這種方式效率高且性能穩(wěn)定,推薦使用。

查看更多Java的語(yǔ)法,大家可以關(guān)注:《Thinking in Java 中文手冊(cè)》、《JDK 1.7 參考手冊(cè)官方英文版》、《JDK 1.6 API java 中文參考手冊(cè)》、《JDK 1.5 API java 中文參考手冊(cè)》,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java讀取傳輸FTP文件實(shí)現(xiàn)示例

    Java讀取傳輸FTP文件實(shí)現(xiàn)示例

    本文主要介紹了Java讀取傳輸FTP文件方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java常見(jiàn)報(bào)錯(cuò):Array?Out?of?Bounds兩種解決辦法

    java常見(jiàn)報(bào)錯(cuò):Array?Out?of?Bounds兩種解決辦法

    這篇文章主要給大家介紹了關(guān)于java報(bào)錯(cuò)Array?Out?of?Bounds的兩種解決辦法,Array out of bounds錯(cuò)誤表示你嘗試訪(fǎng)問(wèn)數(shù)組中不存在的索引,即索引小于零或者大于等于數(shù)組的大小,文中通過(guò)代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Mybatis延遲加載原理和延遲加載配置詳解

    Mybatis延遲加載原理和延遲加載配置詳解

    這篇文章主要介紹了Mybatis延遲加載原理和延遲加載配置詳解,MyBatis中的延遲加載,也稱(chēng)為懶加載,是指在進(jìn)行表的關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún),需要的朋友可以參考下
    2023-10-10
  • jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ)解密顯示功能

    springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ)解密顯示功能

    這篇文章主要介紹了springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ),解密顯示,通過(guò)mybatis,自定義注解+AOP切面,Base64加解密方式實(shí)現(xiàn)功能,本文通過(guò)代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 解決spring AOP中自身方法調(diào)用無(wú)法應(yīng)用代理的問(wèn)題

    解決spring AOP中自身方法調(diào)用無(wú)法應(yīng)用代理的問(wèn)題

    這篇文章主要介紹了解決spring AOP中自身方法調(diào)用無(wú)法應(yīng)用代理的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    本文主要介紹了Java前后端分離項(xiàng)目跨域問(wèn)題解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好用

    Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好用

    今天給大家介紹基于注解的Spring擴(kuò)展,Spring的Xml和JavaConfig 擴(kuò)展的配置方法,關(guān)于Spring的Xml和JavaConfig 擴(kuò)展你會(huì)選哪個(gè)呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-05-05
  • java+selenium爬取圖片簽名的方法

    java+selenium爬取圖片簽名的方法

    這篇文章主要為大家詳細(xì)介紹了java+selenium爬取圖片簽名的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Mybatis 復(fù)雜對(duì)象resultMap的使用

    Mybatis 復(fù)雜對(duì)象resultMap的使用

    這篇文章主要介紹了Mybatis 復(fù)雜對(duì)象resultMap的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

华阴市| 南充市| 乐昌市| 敦化市| 汤原县| 平潭县| 南丹县| 商城县| 宁陵县| 磐安县| 闸北区| 新沂市| 巴马| 湄潭县| 泗水县| 太康县| 新余市| 渝北区| 什邡市| 政和县| 蓝田县| 贺州市| 双城市| 黄石市| 皋兰县| 新巴尔虎右旗| 且末县| 雷波县| 南木林县| 弋阳县| 漯河市| 松潘县| 湟源县| 隆德县| 陕西省| 西宁市| 延吉市| 阜宁县| 将乐县| 九江市| 西丰县|