溫馨提示×

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

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

Java訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的具體步:

發(fā)布時(shí)間:2021-09-15 09:57:09 來(lái)源:億速云 閱讀:121 作者:chen 欄目:數(shù)據(jù)庫(kù)

本篇內(nèi)容介紹了“Java訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的具體步:”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一:Java訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的具體步驟:

1 加載(注冊(cè))數(shù)據(jù)庫(kù) 

 驅(qū)動(dòng)加載就是把各個(gè)數(shù)據(jù)庫(kù)提供的訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的API加載到我們程序進(jìn)來(lái),加載JDBC驅(qū)動(dòng),并將其注冊(cè)到DriverManager中,每一種數(shù)據(jù)庫(kù)提供的數(shù)據(jù)庫(kù)驅(qū)動(dòng)不一樣,加載驅(qū)動(dòng)時(shí)要把jar包添加到lib文件夾下,下面看一下一些主流數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)加裁注冊(cè)的代碼: 

//Oracle8/8i/9iO數(shù)據(jù)庫(kù)(thin模式) 

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 

//Sql Server7.0/2000數(shù)據(jù)庫(kù)   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 

//Sql Server2005/2008數(shù)據(jù)庫(kù)   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 

//DB2數(shù)據(jù)庫(kù) 

Class.froName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();  

//MySQL數(shù)據(jù)庫(kù)  Class.forName("com.mysql.jdbc.Driver").newInstance(); 

建立鏈接   

建立數(shù)據(jù)庫(kù)之間的連接是訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的必要條件,就像南水北調(diào)調(diào)水一樣,要想調(diào)水首先由把溝通的河流打通。建立連接對(duì)于不同數(shù)據(jù)庫(kù)也是不一樣的,下面看一下一些主流數(shù)據(jù)庫(kù)建立數(shù)據(jù)庫(kù)連接,取得Connection對(duì)象的不同方式:

 //Oracle8/8i/9i數(shù)據(jù)庫(kù)(thin模式) 

  String url="jdbc:oracle:thin:@localhost:1521:orcl"; 

  String user="scott"; 

  String password="tiger"; 

  Connection conn=DriverManager.getConnection(url,user,password); 

  //Sql Server7.0/2000/2005/2008數(shù)據(jù)庫(kù) 

  String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; 

  String user="sa"; 

  String password=""; 

  Connection conn=DriverManager.getConnection(url,user,password); 

  //DB2數(shù)據(jù)庫(kù) 

  String url="jdbc:db2://localhost:5000/sample"; 

  String user="amdin" 

  String password=-""; 

  Connection conn=DriverManager.getConnection(url,user,password); 

//MySQL數(shù)據(jù)庫(kù) 

String url="jdbc:mysql://localhost:3306/testDB?user=root&password=root&useUnicode=true&characterEncoding=gb2312"; 

Connection conn=DriverManager.getConnection(url); 

3. 執(zhí)行SQL語(yǔ)句  

數(shù)據(jù)庫(kù)連接建立好之后,接下來(lái)就是一些準(zhǔn)備工作和執(zhí)行sql語(yǔ)句了,準(zhǔn)備工作要做的就是建立Statement對(duì)象PreparedStatement對(duì)象,例如:

 //建立Statement對(duì)象 

 Statement stmt=conn.createStatement(); 

 //建立PreparedStatement對(duì)象 

 String sql="select * from user where userName=? and password=?"; 

  PreparedStatement pstmt=Conn.prepareStatement(sql); 

  pstmt.setString(1,"admin"); 

  pstmt.setString(2,"liubin"); 

做好準(zhǔn)備工作之后就可以執(zhí)行sql語(yǔ)句了,執(zhí)行sql語(yǔ)句:

String sql="select * from users"; 

ResultSet rs=stmt.executeQuery(sql); 

//執(zhí)行動(dòng)態(tài)SQL查詢(xún) 

ResultSet rs=pstmt.executeQuery(); 

//執(zhí)行insert update delete等語(yǔ)句,先定義sql 

stmt.executeUpdate(sql); 

4 處理結(jié)果集  

 訪(fǎng)問(wèn)結(jié)果記錄集ResultSet對(duì)象。例如: 

  while(rs.next) 

  { 

  out.println("你的第一個(gè)字段內(nèi)容為:"+rs.getString("Name")); 

  out.println("你的第二個(gè)字段內(nèi)容為:"+rs.getString(2)); 

  } 

5 關(guān)閉數(shù)據(jù)庫(kù) 

 依次將ResultSet、Statement、PreparedStatement、Connection對(duì)象關(guān)     閉,釋放所占用的資源.例如: 

  rs.close(); 

  stmt.clost(); 

  pstmt.close(); 

  con.close(); 

二:JDBC事務(wù)

什么是事務(wù):

首先,說(shuō)說(shuō)什么事務(wù)。我認(rèn)為事務(wù),就是一組操作數(shù)據(jù)庫(kù)的動(dòng)作集合。

事務(wù)是現(xiàn)代數(shù)據(jù)庫(kù)理論中的核心概念之一。如果一組處理步驟或者全部發(fā)生或者一步也不執(zhí)行,我們稱(chēng)該組處理步驟為一個(gè)事務(wù)。當(dāng)所有的步驟像一個(gè)操 作一樣被完整地執(zhí)行,我們稱(chēng)該事務(wù)被提交。由于其中的一部分或多步執(zhí)行失敗,導(dǎo)致沒(méi)有步驟被提交,則事務(wù)必須回滾到最初的系統(tǒng)狀態(tài)。

事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和持久性(durability)的縮寫(xiě)。事務(wù)的原子性表示事務(wù)執(zhí)行過(guò)程中的任何失敗都將導(dǎo)致事務(wù)所做的任何修改失效。一致性表示 當(dāng)事務(wù)執(zhí)行失敗時(shí),所有被該事務(wù)影響的數(shù)據(jù)都應(yīng)該恢復(fù)到事務(wù)執(zhí)行前的狀態(tài)。隔離性表示在事務(wù)執(zhí)行過(guò)程中對(duì)數(shù)據(jù)的修改,在事務(wù)提交之前對(duì)其他事務(wù)不可見(jiàn)。持 久性表示當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí),確保已提交事務(wù)的更新不能丟失。持久性通過(guò)數(shù)據(jù)庫(kù)備份和恢復(fù)來(lái)保證。

JDBC 事務(wù)是用 Connection 對(duì)象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。 java.sql.Connection 提供了以下控制事務(wù)的方法: 
public void setAutoCommit(boolean) 
public boolean getAutoCommit() 
public void commit() 
public void rollback() 
使用 JDBC 事務(wù)界定時(shí),您可以將多個(gè) SQL 語(yǔ)句結(jié)合到一個(gè)事務(wù)中。JDBC 事務(wù)的一個(gè)缺點(diǎn)是事務(wù)的范圍局限于一個(gè)數(shù)據(jù)庫(kù)連接。一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫(kù)。

三:java操作數(shù)據(jù)庫(kù)連接池

在總結(jié)java操作數(shù)據(jù)庫(kù)連接池發(fā)現(xiàn)一篇很好的文章,所以就不做具體總結(jié)了,直接上地址:

http://www.blogjava.net/chunkyo/archive/2007/01/16/94266.html

最后附一段比較經(jīng)典的代碼吧:

[java]
view plaincopyprint?

  1. import java.sql.Connection;  

  2. import java.sql.DatabaseMetaData;  

  3. import java.sql.Driver;  

  4. import java.sql.DriverManager;  

  5. import java.sql.SQLException;  

  6. import java.sql.Statement;  

  7. import java.util.Enumeration;  

  8. import java.util.Vector;  

  9. public class ConnectionPool {  

  10. private String jdbcDriver = ""// 數(shù)據(jù)庫(kù)驅(qū)動(dòng)

  11. private String dbUrl = ""// 數(shù)據(jù) URL

  12. private String dbUsername = ""// 數(shù)據(jù)庫(kù)用戶(hù)名

  13. private String dbPassword = ""// 數(shù)據(jù)庫(kù)用戶(hù)密碼

  14. private String testTable = ""// 測(cè)試連接是否可用的測(cè)試表名,默認(rèn)沒(méi)有測(cè)試表

  15. private int initialConnections = 10// 連接池的初始大小

  16. private int incrementalConnections = 5;// 連接池自動(dòng)增加的大小

  17. private int maxConnections = 50// 連接池最大的大小

  18. private Vector connections = null// 存放連接池中數(shù)據(jù)庫(kù)連接的向量 , 初始時(shí)為 null


  19. // 它中存放的對(duì)象為 PooledConnection 型


  20. /**

  21. * 構(gòu)造函數(shù)

  22. *

  23. * @param jdbcDriver String JDBC 驅(qū)動(dòng)類(lèi)串

  24. * @param dbUrl String 數(shù)據(jù)庫(kù) URL

  25. * @param dbUsername String 連接數(shù)據(jù)庫(kù)用戶(hù)名

  26. * @param dbPassword String 連接數(shù)據(jù)庫(kù)用戶(hù)的密碼

  27. *

  28. */


  29. public ConnectionPool(String jdbcDriver,String dbUrl,String dbUsername,String dbPassword) {  

  30.          this.jdbcDriver = jdbcDriver;  

  31.          this.dbUrl = dbUrl;  

  32.          this.dbUsername = dbUsername;   

  33.          this.dbPassword = dbPassword;  

  34. }  


  35. /**

  36. * 返回連接池的初始大小

  37. *

  38. * @return 初始連接池中可獲得的連接數(shù)量

  39. */

  40. public int getInitialConnections() {  


  41.          return this.initialConnections;  

  42. }  


  43. /**

  44. * 設(shè)置連接池的初始大小

  45. *

  46. * @param 用于設(shè)置初始連接池中連接的數(shù)量

  47. */


  48. public void setInitialConnections(int initialConnections) {  

  49.          this.initialConnections = initialConnections;  

  50. }  


  51. /**

  52. * 返回連接池自動(dòng)增加的大小 、

  53. *

  54. * @return 連接池自動(dòng)增加的大小

  55. */

  56. public int getIncrementalConnections() {  


  57.          return this.incrementalConnections;  


  58. }  


  59. /**

  60. * 設(shè)置連接池自動(dòng)增加的大小

  61. * @param 連接池自動(dòng)增加的大小

  62. */


  63. public void setIncrementalConnections(int incrementalConnections) {  


  64.          this.incrementalConnections = incrementalConnections;  


  65. }  


  66. /**

  67. * 返回連接池中最大的可用連接數(shù)量

  68. * @return 連接池中最大的可用連接數(shù)量

  69. */


  70. public int getMaxConnections() {  

  71.          return this.maxConnections;  

  72. }  


  73. /**

  74. * 設(shè)置連接池中最大可用的連接數(shù)量

  75. *

  76. * @param 設(shè)置連接池中最大可用的連接數(shù)量值

  77. */


  78. public void setMaxConnections(int maxConnections) {  


  79.          this.maxConnections = maxConnections;  


  80. }  


  81. /**

  82. * 獲取測(cè)試數(shù)據(jù)庫(kù)表的名字

  83. *

  84. * @return 測(cè)試數(shù)據(jù)庫(kù)表的名字

  85. */

  86. public String getTestTable() {  


  87.          return this.testTable;  


  88. }  


  89. /**

  90. * 設(shè)置測(cè)試表的名字

  91. * @param testTable String 測(cè)試表的名字

  92. */

  93. public void setTestTable(String testTable) {  

  94.          this.testTable = testTable;  

  95. }  


  96. /**

  97. *

  98. * 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接池,連接池中的可用連接的數(shù)量采用類(lèi)成員

  99. * initialConnections 中設(shè)置的值

  100. */

  101. public synchronized void createPool() throws Exception {  


  102.          // 確保連接池沒(méi)有創(chuàng)建


  103.          // 如果連接池己經(jīng)創(chuàng)建了,保存連接的向量 connections 不會(huì)為空


  104.          if (connections != null) {  


  105.           return// 如果己經(jīng)創(chuàng)建,則返回


  106.          }  


  107.          // 實(shí)例化 JDBC Driver 中指定的驅(qū)動(dòng)類(lèi)實(shí)例


  108.          Driver driver = (Driver) (Class.forName(this.jdbcDriver).newInstance());  


  109.          DriverManager.registerDriver(driver); // 注冊(cè) JDBC 驅(qū)動(dòng)程序


  110.          // 創(chuàng)建保存連接的向量 , 初始時(shí)有 0 個(gè)元素


  111.          connections = new Vector();  


  112.          // 根據(jù) initialConnections 中設(shè)置的值,創(chuàng)建連接。


  113.          createConnections(this.initialConnections);  


  114.          System.out.println(" 數(shù)據(jù)庫(kù)連接池創(chuàng)建成功! ");  


  115. }  


  116. /**

  117. * 創(chuàng)建由 numConnections 指定數(shù)目的數(shù)據(jù)庫(kù)連接 , 并把這些連接

  118. * 放入 connections 向量中

  119. *

  120. * @param numConnections 要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)連接的數(shù)目

  121. */

  122. @SuppressWarnings("unchecked")  

  123. private void createConnections(int numConnections) throws SQLException {  


  124.          // 循環(huán)創(chuàng)建指定數(shù)目的數(shù)據(jù)庫(kù)連接


  125.          for (int x = 0; x < numConnections; x++) {  


  126.           // 是否連接池中的數(shù)據(jù)庫(kù)連接的數(shù)量己經(jīng)達(dá)到最大?最大值由類(lèi)成員 maxConnections


  127.           // 指出,如果 maxConnections 為 0 或負(fù)數(shù),表示連接數(shù)量沒(méi)有限制。


  128.           // 如果連接數(shù)己經(jīng)達(dá)到最大,即退出。


  129.           if (this.maxConnections > 0 && this.connections.size() >= this.maxConnections) {  


  130.            break;  


  131.           }  


  132.           //add a new PooledConnection object to connections vector


  133.           // 增加一個(gè)連接到連接池中(向量 connections 中)


  134.           try{  


  135.            connections.addElement(new PooledConnection(newConnection()));  


  136.           }catch(SQLException e){  


  137.            System.out.println(" 創(chuàng)建數(shù)據(jù)庫(kù)連接失??! "+e.getMessage());  


  138.           throw new SQLException();  


  139.           }  


  140.           System.out.println(" 數(shù)據(jù)庫(kù)連接己創(chuàng)建 ......");  


  141.          }  

  142. }  


  143. /**

  144. * 創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接并返回它

  145. *

  146. * @return 返回一個(gè)新創(chuàng)建的數(shù)據(jù)庫(kù)連接

  147. */

  148. private Connection newConnection() throws SQLException {  


  149.          // 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接


  150.          Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);  


  151.          // 如果這是第一次創(chuàng)建數(shù)據(jù)庫(kù)連接,即檢查數(shù)據(jù)庫(kù),獲得此數(shù)據(jù)庫(kù)允許支持的


  152.          // 最大客戶(hù)連接數(shù)目


  153.          //connections.size()==0 表示目前沒(méi)有連接己被創(chuàng)建


  154.          if (connections.size() == 0) {  


  155.           DatabaseMetaData metaData = conn.getMetaData();  


  156.           int driverMaxConnections = metaData.getMaxConnections();  


  157.           // 數(shù)據(jù)庫(kù)返回的 driverMaxConnections 若為 0 ,表示此數(shù)據(jù)庫(kù)沒(méi)有最大


  158.           // 連接限制,或數(shù)據(jù)庫(kù)的最大連接限制不知道


  159.           //driverMaxConnections 為返回的一個(gè)整數(shù),表示此數(shù)據(jù)庫(kù)允許客戶(hù)連接的數(shù)目


  160.           // 如果連接池中設(shè)置的最大連接數(shù)量大于數(shù)據(jù)庫(kù)允許的連接數(shù)目 , 則置連接池的最大


  161.           // 連接數(shù)目為數(shù)據(jù)庫(kù)允許的最大數(shù)目


  162.           if (driverMaxConnections > 0 && this.maxConnections > driverMaxConnections) {  


  163.            this.maxConnections = driverMaxConnections;  


  164.           }  

  165.          }   

  166.          return conn; // 返回創(chuàng)建的新的數(shù)據(jù)庫(kù)連接


  167. }  


  168. /**

  169. * 通過(guò)調(diào)用 getFreeConnection() 函數(shù)返回一個(gè)可用的數(shù)據(jù)庫(kù)連接 ,

  170. * 如果當(dāng)前沒(méi)有可用的數(shù)據(jù)庫(kù)連接,并且更多的數(shù)據(jù)庫(kù)連接不能創(chuàng)

  171. * 建(如連接池大小的限制),此函數(shù)等待一會(huì)再?lài)L試獲取。

  172. *

  173. * @return 返回一個(gè)可用的數(shù)據(jù)庫(kù)連接對(duì)象

  174. */


  175. public synchronized Connection getConnection() throws SQLException {  


  176.          // 確保連接池己被創(chuàng)建


  177.          if (connections == null) {  


  178.           return null// 連接池還沒(méi)創(chuàng)建,則返回 null


  179.          }  


  180.          Connection conn = getFreeConnection(); // 獲得一個(gè)可用的數(shù)據(jù)庫(kù)連接


  181.          // 如果目前沒(méi)有可以使用的連接,即所有的連接都在使用中


  182.          while (conn == null){  


  183.           // 等一會(huì)再試


  184.           wait(250);  


  185.           conn = getFreeConnection(); // 重新再試,直到獲得可用的連接,如果


  186.           //getFreeConnection() 返回的為 null


  187.           // 則表明創(chuàng)建一批連接后也不可獲得可用連接


  188.          }  


  189.          return conn;// 返回獲得的可用的連接

  190. }  


  191. /**

  192. * 本函數(shù)從連接池向量 connections 中返回一個(gè)可用的的數(shù)據(jù)庫(kù)連接,如果

  193. * 當(dāng)前沒(méi)有可用的數(shù)據(jù)庫(kù)連接,本函數(shù)則根據(jù) incrementalConnections 設(shè)置

  194. * 的值創(chuàng)建幾個(gè)數(shù)據(jù)庫(kù)連接,并放入連接池中。

  195. * 如果創(chuàng)建后,所有的連接仍都在使用中,則返回 null

  196. * @return 返回一個(gè)可用的數(shù)據(jù)庫(kù)連接

  197. */


  198. private Connection getFreeConnection() throws SQLException {  


  199.          // 從連接池中獲得一個(gè)可用的數(shù)據(jù)庫(kù)連接


  200.          Connection conn = findFreeConnection();  


  201.          if (conn == null) {  


  202.           // 如果目前連接池中沒(méi)有可用的連接


  203.           // 創(chuàng)建一些連接


  204.           createConnections(incrementalConnections);  


  205.           // 重新從池中查找是否有可用連接


  206.           conn = findFreeConnection();  


  207.           if (conn == null) {  


  208.            // 如果創(chuàng)建連接后仍獲得不到可用的連接,則返回 null


  209.            return null;  


  210.           }  


  211.          }  


  212.          return conn;  


  213. }  


  214. /**

  215. * 查找連接池中所有的連接,查找一個(gè)可用的數(shù)據(jù)庫(kù)連接,

  216. * 如果沒(méi)有可用的連接,返回 null

  217. *

  218. * @return 返回一個(gè)可用的數(shù)據(jù)庫(kù)連接

  219. */


  220. private Connection findFreeConnection() throws SQLException {  


  221.          Connection conn = null;  


  222.          PooledConnection pConn = null;  


  223.          // 獲得連接池向量中所有的對(duì)象


  224.          Enumeration enumerate = connections.elements();  


  225.          // 遍歷所有的對(duì)象,看是否有可用的連接


  226.          while (enumerate.hasMoreElements()) {  


  227.           pConn = (PooledConnection) enumerate.nextElement();  


  228.           if (!pConn.isBusy()) {  


  229.            // 如果此對(duì)象不忙,則獲得它的數(shù)據(jù)庫(kù)連接并把它設(shè)為忙


  230.            conn = pConn.getConnection();  


  231.            pConn.setBusy(true);  


  232.            // 測(cè)試此連接是否可用


  233.            if (!testConnection(conn)) {  


  234.             // 如果此連接不可再用了,則創(chuàng)建一個(gè)新的連接,


  235.             // 并替換此不可用的連接對(duì)象,如果創(chuàng)建失敗,返回 null


  236.             try{  


  237.              conn = newConnection();  


  238.             }catch(SQLException e){  


  239.              System.out.println(" 創(chuàng)建數(shù)據(jù)庫(kù)連接失??! "+e.getMessage());  


  240.              return null;  


  241.             }  


  242.             pConn.setConnection(conn);  


  243.            }  


  244.            break// 己經(jīng)找到一個(gè)可用的連接,退出


  245.           }  


  246.          }  


  247.          return conn;// 返回找到到的可用連接


  248. }  


  249. /**

  250. * 測(cè)試一個(gè)連接是否可用,如果不可用,關(guān)掉它并返回 false

  251. * 否則可用返回 true

  252. *

  253. * @param conn 需要測(cè)試的數(shù)據(jù)庫(kù)連接

  254. * @return 返回 true 表示此連接可用, false 表示不可用

  255. */


  256. private boolean testConnection(Connection conn) {  


  257.          try {  


  258.           // 判斷測(cè)試表是否存在


  259.           if (testTable.equals("")) {  


  260.            // 如果測(cè)試表為空,試著使用此連接的 setAutoCommit() 方法


  261.            // 來(lái)判斷連接否可用(此方法只在部分?jǐn)?shù)據(jù)庫(kù)可用,如果不可用 ,


  262.            // 拋出異常)。注意:使用測(cè)試表的方法更可靠


  263.            conn.setAutoCommit(true);  


  264.           } else {// 有測(cè)試表的時(shí)候使用測(cè)試表測(cè)試


  265.            //check if this connection is valid


  266.            Statement stmt = conn.createStatement();  


  267.            stmt.execute("select count(*) from " + testTable);  


  268.           }  


  269.          } catch (SQLException e) {  


  270.           // 上面拋出異常,此連接己不可用,關(guān)閉它,并返回 false;


  271.           closeConnection(conn);  


  272.           return false;  


  273.          }  


  274.          // 連接可用,返回 true


  275.          return true;  


  276. }  


  277. /**

  278. * 此函數(shù)返回一個(gè)數(shù)據(jù)庫(kù)連接到連接池中,并把此連接置為空閑。

  279. * 所有使用連接池獲得的數(shù)據(jù)庫(kù)連接均應(yīng)在不使用此連接時(shí)返回它。

  280. *

  281. * @param 需返回到連接池中的連接對(duì)象

  282. */


  283. public void returnConnection(Connection conn) {  


  284.          // 確保連接池存在,如果連接沒(méi)有創(chuàng)建(不存在),直接返回


  285.          if (connections == null) {  


  286.           System.out.println(" 連接池不存在,無(wú)法返回此連接到連接池中 !");  


  287.           return;  


  288.          }  


  289.          PooledConnection pConn = null;  


  290.          Enumeration enumerate = connections.elements();  


  291.          // 遍歷連接池中的所有連接,找到這個(gè)要返回的連接對(duì)象


  292.          while (enumerate.hasMoreElements()) {  


  293.           pConn = (PooledConnection) enumerate.nextElement();  


  294.           // 先找到連接池中的要返回的連接對(duì)象


  295.           if (conn == pConn.getConnection()) {  


  296.            // 找到了 , 設(shè)置此連接為空閑狀態(tài)


  297.            pConn.setBusy(false);  


  298.            break;  


  299.           }  


  300.          }  


  301. }  


  302. /**

  303. * 刷新連接池中所有的連接對(duì)象

  304. *

  305. */


  306. public synchronized void refreshConnections() throws SQLException {  


  307.          // 確保連接池己創(chuàng)新存在


  308.          if (connections == null) {  


  309.           System.out.println(" 連接池不存在,無(wú)法刷新 !");  


  310.           return;  


  311.          }  


  312.          PooledConnection pConn = null;  


  313.          Enumeration enumerate = connections.elements();  


  314.          while (enumerate.hasMoreElements()) {  


  315.           // 獲得一個(gè)連接對(duì)象


  316.           pConn = (PooledConnection) enumerate.nextElement();  


  317.           // 如果對(duì)象忙則等 5 秒 ,5 秒后直接刷新


  318.           if (pConn.isBusy()) {  


  319.            wait(5000); // 等 5 秒


  320.           }  


  321.           // 關(guān)閉此連接,用一個(gè)新的連接代替它。


  322.           closeConnection(pConn.getConnection());  


  323.           pConn.setConnection(newConnection());  


  324.           pConn.setBusy(false);  


  325.          }  


  326. }  


  327. /**

  328. * 關(guān)閉連接池中所有的連接,并清空連接池。

  329. */


  330. public synchronized void closeConnectionPool() throws SQLException {  


  331.          // 確保連接池存在,如果不存在,返回


  332.          if (connections == null) {  


  333.           System.out.println(" 連接池不存在,無(wú)法關(guān)閉 !");  


  334.           return;  


  335.          }  


  336.          PooledConnection pConn = null;  


  337.          Enumeration enumerate = connections.elements();  


  338.          while (enumerate.hasMoreElements()) {  


  339.           pConn = (PooledConnection) enumerate.nextElement();  


  340.           // 如果忙,等 5 秒


  341.           if (pConn.isBusy()) {  


  342.            wait(5000); // 等 5 秒


  343.           }  


  344.          //5 秒后直接關(guān)閉它


  345.          closeConnection(pConn.getConnection());  


  346.          // 從連接池向量中刪除它


  347.          connections.removeElement(pConn);  


  348.          }  


  349.          // 置連接池為空


  350.          connections = null;  


  351. }  


  352. /**

  353. * 關(guān)閉一個(gè)數(shù)據(jù)庫(kù)連接

  354. *

  355. * @param 需要關(guān)閉的數(shù)據(jù)庫(kù)連接

  356. */


  357. private void closeConnection(Connection conn) {  


  358.          try {  


  359.           conn.close();  


  360.          }catch (SQLException e) {  


  361.           System.out.println(" 關(guān)閉數(shù)據(jù)庫(kù)連接出錯(cuò): "+e.getMessage());  


  362.          }  


  363. }  


  364. /**

  365. * 使程序等待給定的毫秒數(shù)

  366. *

  367. * @param 給定的毫秒數(shù)

  368. */


  369. private void wait(int mSeconds) {  


  370.          try {  


  371.           Thread.sleep(mSeconds);  


  372.          } catch (InterruptedException e) {  


  373.          }  


  374. }  


  375. /**

  376. *

  377. * 內(nèi)部使用的用于保存連接池中連接對(duì)象的類(lèi)

  378. * 此類(lèi)中有兩個(gè)成員,一個(gè)是數(shù)據(jù)庫(kù)的連接,另一個(gè)是指示此連接是否

  379. * 正在使用的標(biāo)志。

  380. */


  381. class PooledConnection {  


  382.          Connection connection = null;// 數(shù)據(jù)庫(kù)連接


  383.          boolean busy = false// 此連接是否正在使用的標(biāo)志,默認(rèn)沒(méi)有正在使用


  384.          // 構(gòu)造函數(shù),根據(jù)一個(gè) Connection 構(gòu)告一個(gè) PooledConnection 對(duì)象


  385.          public PooledConnection(Connection connection) {  


  386.           this.connection = connection;  


  387.          }  


  388.          // 返回此對(duì)象中的連接


  389.          public Connection getConnection() {  


  390.           return connection;  


  391.          }  


  392.          // 設(shè)置此對(duì)象的,連接


  393.          public void setConnection(Connection connection) {  


  394.           this.connection = connection;  


  395.          }  


  396.          // 獲得對(duì)象連接是否忙


  397.          public boolean isBusy() {  


  398.           return busy;  


  399.          }  


  400.          // 設(shè)置對(duì)象的連接正在忙


  401.          public void setBusy(boolean busy) {  


  402.           this.busy = busy;  


  403.          }  


  404. }  


  405. }  


  406. =======================================  


  407. 這個(gè)例子是根據(jù)POSTGRESQL數(shù)據(jù)庫(kù)寫(xiě)的,  

  408. 請(qǐng)用的時(shí)候根據(jù)實(shí)際的數(shù)據(jù)庫(kù)調(diào)整。  


  409. 調(diào)用方法如下:  


  410. ① ConnectionPool connPool  

  411.                                      = new ConnectionPool("org.postgresql.Driver"

  412.                                                                          ,"jdbc:postgresql://dbURI:5432/DBName"

  413.                                                                          ,"postgre"

  414.                                                                          ,"postgre");  


  415. ② connPool .createPool();  

  416.   Connection conn = connPool .getConnection();  

“Java訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的具體步:”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

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

AI