溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java數(shù)據(jù)庫連接池(經(jīng)典)

發(fā)布時間:2020-08-11 19:44:19 來源:ITPUB博客 閱讀:104 作者:liujian_jed 欄目:編程語言

轉(zhuǎn)載自:http://langzixin.iteye.com/blog/808975

不錯的案例,收藏起來,要不時間長了就找不到了

  1. // 唯一實例  
  2.     /** 
  3.     * 返回唯一實例.如果是第一次調(diào)用此方法,則創(chuàng)建實例 
  4.     * 
  5.     * @return DBConnectionManager 唯一實例 
  6.     */  
  7.     /** 
  8.     * 建構(gòu)函數(shù)私有以防止其它對象創(chuàng)建本類實例 
  9.     */  
  10.     /** 
  11.     * 將連接對象返回給由名字指定的連接池 
  12.     * 
  13.     * @param name 在屬性文件中定義的連接池名字 
  14.     * @param con 連接對象 
  15.     */  
  16.     /** 
  17.     * 獲得一個可用的(空閑的)連接.如果沒有可用連接,且已有連接數(shù)小于最大連接數(shù) 
  18.     * 限制,則創(chuàng)建并返回新連接 
  19.     * 
  20.     * @param name 在屬性文件中定義的連接池名字 
  21.     * @return Connection 可用連接或null 
  22.     */  
  23.     /** 
  24.     * 獲得一個可用連接.若沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制, 
  25.     * 則創(chuàng)建并返回新連接.否則,在指定的時間內(nèi)等待其它線程釋放連接. 
  26.     * 
  27.     * @param name 連接池名字 
  28.     * @param time 以毫秒計的等待時間 
  29.     * @return Connection 可用連接或null 
  30.     */  
  31.     /** 
  32.     * 關(guān)閉所有連接,撤銷驅(qū)動程序的注冊 
  33.     */  
  34.     // 等待直到最后一個客戶程序調(diào)用  
  35.     "撤銷JDBC驅(qū)動程序 " + driver.getClass().getName()+"的注冊");  
  36.     }  
  37.     "無法撤銷下列JDBC驅(qū)動程序的注冊: " + driver.getClass().getName());  
  38.     }  
  39.     }  
  40.     }  
  41.   
  42.     /** 
  43.     * 根據(jù)指定屬性創(chuàng)建連接池實例. 
  44.     * 
  45.     * @param props 連接池屬性 
  46.     */  
  47.     ".url")) {  
  48.     String poolName = name.substring("."));  
  49.     String url = props.getProperty(poolName + ".url");  
  50.     "沒有為連接池" + poolName + "指定URL");  
  51.     ".user");  
  52.     String password = props.getProperty(poolName + ".password");  
  53.     String maxconn = props.getProperty(poolName + ".maxconn""0");  
  54.        
  55.     "錯誤的最大連接數(shù)限制: " + maxconn + " .連接池: " + poolName);  
  56.     max = "成功創(chuàng)建連接池" + poolName);  
  57.     }  
  58.     }  
  59.     }  
  60.   
  61.     /** 
  62.     * 讀取屬性完成初始化 
  63.     */  
  64.     "/db.properties");  
  65.     Properties dbProps = "讀取數(shù)據(jù)成功!");  
  66.     }  
  67.     "不能讀取屬性文件. " +  
  68.     "請確保db.properties在CLASSPATH指定的路徑中");  
  69.     "logfile""DBConnectionManager.log");  
  70.     System.out.print(logFile);  
  71.     "無法打開日志文件: " + logFile);  
  72.     log = /** 
  73.     * 裝載和注冊所有JDBC驅(qū)動程序 
  74.     * 
  75.     * @param props 屬性 
  76.     */  
  77.     "drivers");  
  78.     StringTokenizer st = "成功注冊JDBC驅(qū)動程序" + driverClassName);  
  79.     }  
  80.     "無法注冊JDBC驅(qū)動程序: " +  
  81.     driverClassName + ", 錯誤: " + e);  
  82.     }  
  83.     }  
  84.     }  
  85.   
  86.     /** 
  87.     * 將文本信息寫入日志文件 
  88.     */  
  89.     ": " + msg);  
  90.     }  
  91.   
  92.     /** 
  93.     * 將文本信息與異常寫入日志文件 
  94.     */  
  95.     ": " + msg);  
  96.     e.printStackTrace(log);  
  97.     }  
  98.   
  99.     /** 
  100.     * 此內(nèi)部類定義了一個連接池.它能夠根據(jù)要求創(chuàng)建新連接,直到預(yù)定的最 
  101.     * 大連接數(shù)為止.在返回連接給客戶程序之前,它能夠驗證連接的有效性. 
  102.     */  
  103.     /** 
  104.     * 創(chuàng)建新的連接池 
  105.     * 
  106.     * @param name 連接池名字 
  107.     * @param URL 數(shù)據(jù)庫的JDBC URL 
  108.     * @param user 數(shù)據(jù)庫帳號,或 null 
  109.     * @param password 密碼,或 null 
  110.     * @param maxConn 此連接池允許建立的最大連接數(shù) 
  111.     */  
  112.     /** 
  113.     * 將不再使用的連接返回給連接池 
  114.     * 
  115.     * @param con 客戶程序釋放的連接 
  116.     */  
  117.     // 將指定連接加入到向量末尾  
  118.     freeConnections.addElement(con);  
  119.     checkedOut--;  
  120.     notifyAll();  
  121.     }  
  122.   
  123.     /** 
  124.     * 從連接池獲得一個可用連接.如沒有空閑的連接且當前連接數(shù)小于最大連接 
  125.     * 數(shù)限制,則創(chuàng)建新連接.如原來登記為可用的連接不再有效,則從向量刪除之, 
  126.     * 然后遞歸調(diào)用自己以嘗試新的可用連接. 
  127.     */  
  128.     // 獲取向量中第一個可用連接  
  129.     con = (Connection) freeConnections.firstElement();  
  130.     freeConnections.removeElementAt("從連接池" + name+"刪除一個無效連接");  
  131.     // 遞歸調(diào)用自己,嘗試再次獲取可用連接  
  132.     con = getConnection();  
  133.     }  
  134.     }  
  135.     "從連接池" + name+"刪除一個無效連接");  
  136.     // 遞歸調(diào)用自己,嘗試再次獲取可用連接  
  137.     con = getConnection();  
  138.     }  
  139.     }  
  140.     /** 
  141.     * 從連接池獲取可用連接.可以指定客戶程序能夠等待的最長時間 
  142.     * 參見前一個getConnection()方法. 
  143.     * 
  144.     * @param timeout 以毫秒計的等待時間限制 
  145.     */  
  146.     // wait()返回的原因是超時  
  147.     /** 
  148.     * 關(guān)閉所有連接 
  149.     */  
  150.     "關(guān)閉連接池" + name+"中的一個連接");  
  151.     }  
  152.     "無法關(guān)閉連接池" + name+"中的連接");  
  153.     }  
  154.     }  
  155.     freeConnections.removeAllElements();  
  156.     }  
  157.   
  158.     /** 
  159.     * 創(chuàng)建新的連接 
  160.     */  
  161.     "連接池" + name+"創(chuàng)建一個新的連接");  
  162.     }  
  163.     "無法創(chuàng)建下列URL的連接: " + URL);  
  164.     
  165. <%@ page language="java" "java.util.*" pageEncoding="UTF-8"%>  
  166. <%@ page "java.sql.*"%>  
  167. <%@ page "myDB.DBConnectionManager"%>  
  168. <%  
  169. String path = request.getContextPath();  
  170. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  171. %>  
  172.   
  173. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  174. <html>  
  175.     <head>  
  176.         <base href="<%=basePath%>">  
  177.   
  178.         <title>My JSP 'index.jsp' starting page</title>  
  179.         <meta http-equiv="pragma" content="no-cache">  
  180.         <meta http-equiv="cache-control" content="no-cache">  
  181.         <meta http-equiv="expires" content="0">  
  182.         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  183.         <meta http-equiv="description" content="This is my page">  
  184.         <!--  
  185.     <link rel="stylesheet" type="text/css" href="styles.css">  
  186.     -->  
  187.     </head>  
  188.   
  189.     <body>  
  190.         This is my JSP page.  
  191.         <br>  
  192. <%  
  193. //單例模式,只是在第一次調(diào)用該方法時生成實例,在服務(wù)器中該類只保存一個實例  
  194.   out.println("JAVA連接池類測試<br/>");  
  195.   Connection con = dbM.getConnection("mysqldb");//mysqldb是db.properties配置文件中設(shè)置的  
  196.   out.print(dbM.getClient());  
  197.   "不能獲取數(shù)據(jù)庫連接.");  
  198.    //dbM.release();  
  199.   }  
  200.   "select * from first_table");  
  201.    "<br/>");  
  202.    }  
  203.    rs.close();  
  204.    stmt.close();  
  205.    dbM.freeConnection("mysqldb", con);  
  206.      
  207.   }  
  208.     
  209.   Connection oraclecon = dbM.getConnection("oracledb");//oracledb是db.properties配置文件中設(shè)置的  
  210.   out.print(dbM.getClient());  
  211.   "不能獲取數(shù)據(jù)庫連接.");  
  212.    //dbM.release();  
  213.   }  
  214.   "select * from on_campus_student where rownum<=5");  
  215.    "<br/>");  
  216.    }  
  217.    rs.close();  
  218.    stmt.close();  
  219.    dbM.freeConnection("oracledb", oraclecon);  
  220.      
  221.   }  
  222.  } catch (Exception ee)  
  223.  {  
  224.   out.print(ee.getMessage());  
  225.  }  
  226. %>  
  227.     </body>  
  228. </html>  

 7、可以方便的獲得各種數(shù)據(jù)庫連接(預(yù)先在db.properties中配置) 

 

 com.mysql.jdbc.Driver oracle.jdbc.driver.OracleDriver

 

 不同數(shù)據(jù)庫之間用空格隔開即可


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI