1. 12. sharding-jdbc源碼之強制路由
位於 sharding-jdbc-core 模塊下的包 com.dangdang.ddframe.rdb.sharding.hint 中,核心類 HintManagerHolder 的部分源碼如下:
ThreadLocal中管理的 HintManager 定義如下:
分析了sharding-jdbc的強制路由實現的源碼,接下來說說如何使用這一niubility特性,假定數據源定義如下:
2. Driver driver = new com.mysql.jdbc.Driver( ); 用通俗的語言怎麼解釋這句代碼 在線等.....
jdbc和連接池對於你這個場景來說,都足夠,既然用spring管理了,建議還是使用連接池,另外,spring自身沒有實現連接池,一般都是對第三方連接池的包裝,常見的有C3P0,dbcp以及最近比較流行的boneCP等,這幾個配置都差不多太多,以boneCP為例:
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
3. 深入理解spark核心思想與源碼分析 怎麼樣
SparkSQL主要的推動者是Databricks。提到SparkSQL不得不提的就是Shark。Shark可以理解為Spark社區這邊搞的一個」HiveonSpark」,把Hive的物理執行計劃使用Spark計算引擎去執行。這裡面會有一些問題,Hive社區那邊沒有把物理執行計劃到執行引擎這個步驟抽象出公共API,所以Spark社區這邊要自己維護一個Hive的分支,而且Hive的設計和發展不太會考慮到如何優化Spark的Job。但是前面提到的HiveonSpark卻是和Hive一起發布的,是由Hive社區控制的。所以後來Spark社區就停止了Shark的開發轉向SparkSQL(「坑了」一部分當時信任Shark的人)。SparkSQL是把SQL解析成RDD的transformation和action,而且通過catalyst可以自由、靈活的選擇最優執行方案。對資料庫有深入研究的人就會知道,SQL執行計劃的優化是一個非常重要的環節,SparkSQL在這方面的優勢非常明顯,提供了一個非常靈活、可擴展的架構。但是SparkSQL是基於內存的,元數據放在內存裡面,不適合作為數據倉庫的一部分來使用。所以有了SparkSQL的HiveContext,就是兼容Hive的SparkSQL。它支持HiveQL,HiveMetastore,HiveSerDesandHiveUDFs以及JDBCdriver。這樣看起來很完美,但是實際上也有一些缺點:SparkSQL依賴於Hive的一個snapshot,所以它總是比Hive的發布晚一個版本,很多Hive新的feature和bugfix它就無法包括。而且目前看Spark社區在Spark的thriftserver方面的投入不是很大,所以感覺它不是特別想朝著這個方向發展。還有一個重要的缺點就是SparkSQL目前還不能通過分析SQL來預測這個查詢需要多少資源從而申請對應的資源,所以在共享集群上無法高效地分配資源和調度任務。
4. 如何找到mysql-jdbc驅動源碼
在工程中右鍵新建file,命名為jdbc.properties
創建完畢如圖:
在jdbc.properties文件中輸入如下信息,分別是資料庫的驅動,連接,用戶名和密碼
新建JdbcTest2.java類
輸入如下代碼:
代碼說明:
這段代碼是讀取配置文件,把配置文件中的各個項通過名稱讀取出來
這段代碼是通過反射來創建Driver對象,反射就是類的實例化
在主函數中輸入如下,測試方法
運行之後的結果如下,表示連接成功!
5. 幫分析一下 java.sql.SQLException: 源代碼 和 報錯 情況如下.
先檢查是不是密碼用戶名埠都正確
還不行就,別用localhost,改用127.0.0.1
還不行你就安裝sqlserver 2000 sp3
還不行,你看看是不是sqlserver禁止使用你的tcp/ip協議
還不行換個埠別用1433,1433好像有bug
再不行,你就祈禱吧
6. jsp中用於載入資料庫驅動的介面是
JDBC由Sun公司制定,全稱Java DataBase Connectivity,是一種可以執行SQL語句並可返回結果的Java API,支持多種關系型資料庫,封裝在java.sql.*
它的具體位置在\jre7\lib\rt.jar
1、JDBC的工作原理
JDBC的最大特點是獨立於具體的關系型資料庫,它定義了一系列的Java類,完成資料庫連接(Connections)、SQL語句(Statements)、結果集(ResultSet)和其他的資料庫對象,從而達到Java程序和資料庫交互的目的
2、JDBC的四種驅動類型
在Java程序中,JDBC可以分為以下4種驅動類型:
(1)JDBC-ODBC Bridge
用JDBC-ODBC Bridge可以訪問一個ODBC數據源,但在執行Java程序的機器上必須安裝ODBC驅動,並完成配置
可以看出,中間存在一個JDBC-ODBC的轉換,影響了執行的效率
(2)JDBC Native Bridge
這種方式需要在執行JSP程序的機器上安裝本地的針對特定資料庫(MySQL/SQL/Oracle)的驅動程序,通過這個程序把對資料庫的JDBC調用轉化為資料庫的API調用,性能比JDBC-ODBC更好,缺點是要安裝驅動
(3)JDBC-Network Bridge
這種方式不需要安裝驅動程序,直接用JDBC通過網路連接資料庫,與平台無關,所以在WEB開發中大量使用
(4)Pure Java JDBC Driver
Java驅動程序運行在客戶端,客戶端可以直接訪問資料庫,其體系結構最為簡單,因此安全性及程序的邏輯性不行
3、JDBC連接資料庫(以mysql為例)
(1)載入JDBC驅動程序
通過java.lang.Class類中的靜態方法forName實現
(2)提供JDBC連接的URL
協議:子協議:數據源標識
其中,協議:在JDBC中總是以jdbc開始
子協議:是Bridge的驅動程序或是資料庫管理系統名稱,如MySQL就是mysql,常用的埠號是3306
數據源標識:標記找出數據源的地址和連接介面
(3)創建資料庫的連接
向java.sql.DriverManager請求獲取Connection對象
(4)創建Statement
其中Statement分為三類,區別如下:
A、執行靜態SQL:通過Statement實例實現
B、執行動態SQL:通過PreparedStatement實例實現
C、執行資料庫存儲過程:通過CallableStatement實例實現
(5)執行SQL語句,完成資料庫的增刪改或是查詢功能
其中Statement介面提供了三種執行SQL語句的方法,區別如下:
A、Result executeQuery(String sqlString):用於查詢資料庫的SQL,如SELECT,返回一個結果集(ResultSet)
B、int executeUpdate(String sql):用於執行INSERT、UPDATE或DELETE語句以及SQL DDL(數據定義)語句
C、boolean execute(String sql):用於返回多個結果集、多個更新計數或者二者組合(不太懂)
(6)得到處理結果(ResultSet)
(7)關閉JDBC對象
先關閉Statement再關閉Connection連接
參考文獻:
1、鄧子雲,《JSP網路編程從基礎到實踐》(第2版)
2、邱加永,孫連偉,《JSP基礎與案例開發詳解》
3、譚貞軍,《深入理解Java Web開發技術:探索基於主流框架的最佳組合》
文章知識點與官方知識檔案匹配
Java技能樹使用JDBC操作資料庫JDBC概述
84644 人正在系統學習中
打開CSDN,閱讀體驗更佳
jsp學習筆記之JDBC原理及其使用_地球是圓嘀的博客
java項目的導包方式與javaweb項目的導包方式不一樣 java項目:1.jar復制到工程這種 2.右鍵jar:build path 3.add external jars javaweb項目 1.jar項目復制到WEB-INF的lib中 核心:將java中的JDBC代碼,復制到JSP中的<% %> ...
JSP原理、使用_lpw666_的博客
JDBC 固定步驟: 事務 Junit單元測試 搭建一個環境,事務回滾 1、JSP 1.1、什麼是JSP Java Server Pages : Java伺服器端頁面,也和Servlet一樣,用於動態Web技術! 最大的特點: 寫JSP就像在寫HTML ...
關鍵技術——JSP與JDBC應用詳解(電子版)
本書詳細講解了JSP和JDBC內容,適合Java開發人員使用,也是Java開發人員必須掌握的知識
java連接資料庫——JSP實現JDBC
前兩個是java連接資料庫的典型方式,雖然除了JDBC還有odbc的方式,但odbc的效率和跨平台都不理想,所以現在的趨勢就是使用JDBC來連接需要的資料庫(我以MySQL為例),這節將介紹JSP中如何實現連接資料庫,其實原理都一樣,只是技術不同,建議在看本節知識的時候,以及對JSP技術和前端知識有一定的了解,要不然,或許不好理解。 以下是代碼: <%@ page language="...
繼續訪問
JDBC 詳解_IT__learning的博客_jdbc
三、JDBC 工作原理 1、裝載驅動程序 JDBC 中規定,驅動類在被載入時,需要自己「主動」把自己注冊到 DriverManger 中。com.mysql.jdbc.Driver 類的源代碼如下: 通過以上源碼可知我們注冊驅動的時候只是 new 了自己,也就是 Driver。既然...
jsp學習 jdbc訪問資料庫_黑貓貓琉璃的博客
Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp", "root", "123456"); 3、創建sql會話對象preparedStatement(注意這個動態的preparedStatement類它的父類其實是Statement) ...
最新發布 jdbc的原理示意圖和模擬實現
本次博客帶領大家學習JDBC的原理示意圖和模擬實現。
繼續訪問
jsp,servlet,類,jdbc項目運行原理以及最開始打開的頁面需要傳遞數據時的處理
實現一個web項目時,顯示主要靠的是html頁面,這屬於靜態顯示。而動態顯示就需要用到jsp頁面。 靜態頁面間的跳轉主要是通過a標簽,而動態頁面跳轉也是通過a標簽,但是需要傳遞數據。當然也可以通過表單的提交。 頁面呢,也分為傳遞數據的頁面和接收數據的頁面。 傳遞數據的頁面呢,是通過a標簽後面攜帶的參數跳轉到需要接收數據的頁面以保證接收數據的頁面動態的數據顯示,或者通過表單提交的對應servl...
繼續訪問
JavaWeb——JSP原理剖析和執行過程_萬里顧—程的博客
JavaWeb——JSP原理剖析 1.什麼是JSP JSP(Java Server Pages):Java伺服器端頁面,和Servlet一樣,是一種動態網頁開發技術。 JSP是一種Java servlet,基於Java Servlet API 因此,JSP擁有各種強大的企業級Java API,包括JDBC, JNDI(Java Na...
jdbc連接mysql原理_JDBC 原理淺析_月塔的博客
五.詳解JDBC原理: <1>. 結構: DriverManager (是一工廠實現類,用了工廠方法模式) | Dirver (是驅動程序對象的介面,指向具體資料庫驅動程序對象=DriverManager.getDriver(String URL)) |
JSP中操作資料庫的三個對象:Statement、PreparedStatement、CallableStatement
1、創建 Statement 對象 建立了到特定資料庫的連接之後,就可用該連接發送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創建,如下列代碼段中所示: Connection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.c
繼續訪問
JSP訪問資料庫
JSP訪問資料庫內容介紹
繼續訪問
Java中原生操作JDBC連接及原理_架構潛行之路的博客_java原生j...
JDBC全稱又叫做Java DataBase Connectivity,也就是Java資料庫連接,說白了就是用Java語言來操作數據 庫,提供統一API訪問資料庫操作。 二、原理 JDBC主要是用於java連接資料庫的,能連接什麼資料庫不固定,其實能連接很多種資料庫,而且一般來...
JDBC編程的三個介面
JDBC編程的Connention介面,Statement介面和ResulSet介面,JDBC編程一個簡單的查詢過程
繼續訪問
3-JSP+JDBC資料庫應用開發初步(二)
一、JSP+Servlet+JDBC開發資料庫應用 上一講「JSP+JDBC資料庫應用開發初步」中,我們給出了一個小例子,採用JSP頁面來處理用戶的登錄請求。本講中,我們將該JSP頁面替換為Servlet來處理用戶登錄請求。 實驗步驟如下: 用戶登錄頁面仍然採用原來的login.jsp頁面,只需要把form表單的action方法修改為Servlet的url即可,其它不變。 資源頁面也仍然採用resource.jsp不變,注意:該頁面需要讀取session中保存的用戶名,若存在,則說明用戶登錄成功,可以顯示
繼續訪問
java、jdbc、jsp……的簡單解釋
java版本 1. J2ME,功能有限,用於嵌入式設備。 2. J2SE,包含原始的核心類庫,用於桌面應用程序和瀏覽器中的applet 3. J2EE,功能非常全面,用於數據處理和處理器端應用 J2EE功能非常的全面,那就看看它的工作模式圖: JDBC是什麼? 它是為java開發人員提供了一個行業標准API,可以在java應用與關系資料庫之間建立起獨立於資料庫的連接,A...
繼續訪問
JSP基礎(十二)——初步認識JDBC
與資料庫交互是Web應用程序的一個重要的組成部分,JSP使用JDBC(Java DataBase Connectivity)技術來實現與資料庫的連接。JDBC提供了JSP操作資料庫的各種介面,所以JDBC資料庫編程對Web開發是非常重要的。很多DBMS(資料庫管理系統)都提供JDBC驅動程序,JSP可以直接利用它訪問資料庫,有些DBMS沒有提供JDBC驅動程序,JSP可以通過Sun公司的JDBC-
繼續訪問
JDBC在jsp中的使用
今天在學習JDBC在jsp中的應用時遇到了一些問題,解決後記錄一下,希望對其他人能有幫助。 默認讀者具有一定的jsp和資料庫知識,所以對這兩者不做介紹,本文主要是解決按照書上的代碼敲出來最後卻不能得到想要的結果的問題。 第一步,導包 導入需要的包,例如java.sql.* java.io.* 第二步,載入資料庫驅動 大家為了更好的記憶操作步驟,不要每次建立資料庫連接時都要找資料,我們應該了解每一步都是為了達到什麼目的,例如現在的載入資料庫驅動,可能有人會問?什麼是資料庫驅動呢? 資料庫驅動是不
繼續訪問
JDBC,資料庫與jsp的連接
JDBC技術的出現 為何會出現JDBC?對於我們的數據來說,都是具有時效性的,而有些數據是需要長久的保存下去,但是單單jsp並不能做到長久保存,因此我們需要將其保存在專門儲存在資料庫中,而jsp再次使用此數據的時候需要調用,因此就需要有一個中間的橋梁將資料庫與jsp連接起來。但是最開始只有OBDC,OBDC是C語言開發的,主要再Windows環境中使用,如果用其他語言開發應用程序還需要其他中介的API和OBDC做溝通鏈接,這是很復雜的事。因此JDBC應運而生,這是專門針對Java和資料庫連接技術,使得開發人
繼續訪問
JSP+JDBC連接資料庫
首先 在創建項目時,要連接資料庫,要將jar包導入項目(這只是方式之一,還有其他的方式實現同樣的效果) 將jar包放在WEB-INF/lib目錄下,然後右鍵,點擊Build Path→Add to Build Path將其添加到項目的Libraries中,然後在JSP頁面中頭部添加如下代碼 <%@page import="java.sql.*"%> 即圖中所示: 接下來就可以打代碼了。 資料庫的連接 //1.獲取Driver實現類的對象 Class.forName("com.mysql.
繼續訪問
JSP和JDBC的使用
查詢數據 <%@ page import="java.sql.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en">
繼續訪問
認識JSP連接資料庫原理
昨天有人來問JSP用jdbc連接資料庫的兩種方式,我懵了,才發現自己真的爛到家了,連這個都不知道,只會按網上說的方法寫代碼,根本就不懂原理,我需要知道原理。從網上查到一些說法,我綜合整理了一下得出一些結論: 有人說JSP網站連接資料庫有4種類型: [1]JDBC-OD
繼續訪問
關於Java Web的Servlet+JDBC(封裝)+JSP的登錄(送給入門的你)
關於Java Web的Servlet+JDBC(封裝)+JSP的登錄(送給入門的你)
JDBC與JSP初識
主要內容: -JDBC 三層架構進行組織後台代碼 -JSP初識 - 在頁面展示表中數據 - 在頁面輸入數據並處理數據課堂參考代碼: 1、後台代碼: (1)cn.st.. BaseDao.javapackage cn.st.; import java.sql.Connection; import java.sql.DriverManage
繼續訪問
初學JSP與JDBC(mysql資料庫)
之前一直不知道jsp怎麼和資料庫連接,後來看了大神的博客以及看書大概知道了一些。 1.下好jdbc的包。見鏈接。 把下載好的包放在tomcat的lib文件夾下面,然後建立一個web工程導入這個包。 ->build path->configure build path-> 然後就導入成功了。 我用的是mysql資料庫。(資料庫方面我就不多做解釋,不懂的可以去查一查。) 2.JDB
繼續訪問
關於jsp+jdbc的簡單實例
在頁面顯示所查資料庫的內容,以表格形式顯示 <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.SQLException&q
繼續訪問
JSP——JDBC相關
參考博客:https://www.cnblogs.com/xiaotiaosi/p/6394554.html JDBC中常用的類和介面: 1、驅動程序管理類:DriverManager 這個類是很重要的一個類,使用的頻率也是比較高的,對於一般程序員來說 用的最多的一個方法就是Drivermanager.getConnection
7. oracle jdbc驅動源代碼
可以用JD-GUI反編譯jar
8. JDBC的工作原理是什麼
JDBC是Sun公司制定的一個可以用Java語言連接資料庫的技術。
JDBC工作原理主要分3個步驟:1、載入資料庫驅動。2、獲取資料庫連接。3、發送sql語句訪問資料庫 。
1、載入數據驅動:使用Class.forName方法,調用這個方法會載入資料庫驅動com.MySQL.jdbc.driver。
關於資料庫驅動的理解,其實是sun公司給了一個Driver的介面,然後各個數據廠商根據自己的資料庫
來實現這個介面。當要訪問資料庫的時候,需要引入這個第三方類庫。類的載入主要分為5個部分,
載入、驗證、准備、解析、初始化。在初始化的部分用到了DriverManager.registerDriver()方法,將
自己注冊給DriverManager的Driver介面。這個地方體現了多態。這個時候就可以使用Driver了。
2、獲取資料庫連接DriverManager.getConnection()。這個方法主要調用driver的connect()方法
返回一個實現了Connection介面的對象。
3、然後利用Connection對象創建Statement,發送sql語句訪問資料庫。
延伸:JDBC基礎知識
JDBC(Java DataBase Connectivity,java資料庫連接)是一種用於執行SQL語句的Java API,可以為多種關系資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC為資料庫開發人員提供了一個標準的API,據此可以構建更高級的工具和介面,使資料庫開發人員能夠用純 Java API 編寫資料庫應用程序,並且可跨平台運行,並且不受資料庫供應商的限制。
1、跨平台運行:這是繼承了Java語言的「一次編譯,到處運行」的特點;
2、不受資料庫供應商的限制:巧妙在於JDBC設有兩種介面,一個是面向應用程序層,其作用是使得開發人員通過SQL調用資料庫和處理結果,而不需要考慮資料庫的提供商;另一個是驅動程序層,處理與具體驅動程序的交互,JDBC驅動程序可以利用JDBC API創建Java程序和數據源之間的橋梁。應用程序只需要編寫一次,便可以移到各種驅動程序上運行。Sun提供了一個驅動管理器,資料庫供應商——如MySQL、Oracle,提供的驅動程序滿足驅動管理器的要求就可以被識別,就可以正常工作。所以JDBC不受資料庫供應商的限制。
JDBC API可以作為連接Java應用程序與各種關系資料庫的紐帶,在帶來方便的同時也有負面影響,以下是JDBC的優、缺點。優點如下:
· 操作便捷:JDBC使得開發人員不需要再使用復雜的驅動器調用命令和函數;
· 可移植性強:JDBC支持不同的關系資料庫,所以可以使同一個應用程序支持多個資料庫的訪問,只要載入相應的驅動程序即可;
· 通用性好:JDBC-ODBC橋接驅動器將JDBC函數換成ODBC;
· 面向對象:可以將常用的JDBC資料庫連接封裝成一個類,在使用的時候直接調用即可。
缺點如下:
· 訪問數據記錄的速度受到一定程度的影響;
· 更改數據源困難:JDBC可支持多種資料庫,各種資料庫之間的操作必有不同,這就給更改數據源帶來了很大的麻煩
9. jsp連接Access
開始接觸JDBC時,一直有一個疑慮,為什麼執行Class.forName(「com.mysql.jdbc.Driver「)就可以載入MySql的驅動程序?JDBC的驅動程序初始化過程是怎麼樣的?連接具體的資料庫時,JDBC的DriverManager又是如何運作的?帶著這么幾個疑惑,本人下載了MySql的驅動源代碼,結合J2SDK的源代碼,分析了一下JDBC的驅動管理機制。
1. 分析JDBC的驅動程序管理部分的實現代碼:
在JDBC的層次上,sun主要定義了1個介面Driver和兩個類:DirverManager和DriverInfo。每個JDBC驅動程序必須實現Driver介面(在MySql的Connector/J驅動中,這個叫做com.mysql.jdbc.Driver)。而DriverManager則負責管理所有的Driver對象,包含注冊Driver;選擇合適的Driver來建立到某個資料庫的連接;以及進行一些Driver的信息管理等。DriverInfo非常簡單,用於保存Driver的信息,只有3個成員變數,Driver,DriverClass和DriverClassName,意義非常明顯。
先看一下在DriverManager.java中的關鍵代碼:
private static java.util.Vector drivers = new java.util.Vector();
所有的Driver對象保存在一個Vector數組中。
注冊Driver的函數叫registerDriver,將需要注冊的Driver對象傳入即可:
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
if (!initialized) { //如果沒有初始化,則先初始化
initialize();
}
DriverInfo di = new DriverInfo(); //實際保存的不是Driver,而是一個DriverInfo對象,但是DriverInfo的其它成員完全可以由Driver推導出來,所以個人覺得DriverInfo對象可有可無,直接使用Driver應該就可以了。
di.driver = driver;
di.driverClass = driver.getClass();
di.driverClassName = di.driverClass.getName();
drivers.addElement(di); //將DriverInfo對象添加到數組中
println("registerDriver: " + di);
}
這樣就完成了驅動程序的注冊過程。然後重點看一下建立資料庫連接的代碼,在getConnection函數中,省略了一些非關鍵代碼:
private static synchronized Connection getConnection(
String url, java.util.Properties info, ClassLoader callerCL) throws SQLException {
SQLException reason = null;
//輪詢所有的DriverInfo對象。
for (int i = 0; i < drivers.size(); i++) {
DriverInfo di = (DriverInfo)drivers.elementAt(i);
try {
//使用DriverInfo中的Driver對象去做實際的連接資料庫的工作
Connection result = di.driver.connect(url, info);
if (result != null) {
// Success!
println("getConnection returning " + di);
return (result); //一旦成功連接,直接返回Connection對象,然後推出
}
} catch (SQLException ex) {
...
}
}
//這就是經常看到的出錯信息--找不到合適的驅動程序。
println("getConnection: no suitable driver");
throw new SQLException("No suitable driver", "08001");
}
由上面的getConnection函數可以看到,真正實現資料庫連接的是Driver對象的connect函數。而且可以看到,由於DriverManager.getConnection使用的是一種輪詢的方式,注冊的驅動程序越多,連接速度會越慢。JDBC連接資料庫的速度很慢,是不是和這種實現方式有關聯呢?懷著這個問題,本人下載了MySql的Connector/J驅動包,開始分析其connect函數的實現。
2. 分析MySql的注冊和建立連接部分的代碼:
打開MySql的源碼包,首先分析其Driver類的實現。發現Driver類的實現非常簡單,
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
可以看到,有一段static代碼,調用了DriverManager的registerDriver方法。這其實就解釋了Class.forName(「com.mysql.jdbc.Driver」)能夠完成MySql驅動注冊的問題。因為forName會導致這段static代碼被調用,從而間接調用了registerDriver,完成注冊過程。
com.mysql.jdbc.Driver從com.mysql.jdbc.NonRegisteringDriver繼承而來,實際上是NonReisteringDriver完成了java.sql.Driver介面的實現工作。轉移目標,分析NonRegisteringDriver的connect函數。
NonRegisteringDriver.connect的實現也比較簡單,正合我意:
public java.sql.Connection connect(String url, Properties info)
throws SQLException {
//1. 分析傳入的連接字元串.
if ((props = parseURL(url, info)) == null) {
return null;
}
try {
//2. 建立一個Connection對象完成實際的資料庫連接工作
Connection newConn = new com.mysql.jdbc.Connection(host(props),
port(props), props, database(props), url, this);
return newConn;
非常簡單,先parseURL,然後使用Connection去建立連接。parseURL只是簡單的字元串分析,主要是分析傳入的連接字元串是否滿足「jdbc:mysql://host:port/database「的格式,如果不滿足,直接返回null,然後由DriverManager去試驗下一個Driver。如果滿足,則建立一個Connection對象建立實際的資料庫連接,這不是本人關注的問題,源碼分析就此打住。
這也就解釋了第二個問題,DriverManager的輪詢查詢注冊的Driver對象的工作方式所帶來的性能代價並不是很大,主工作量只是parseURL函數。
10. 在jdbcapi,statement哪個方法可以用來限制查詢返回的記錄數
jdbc驅動
java jdbc連接_2019最新JDBC面試題(附JDBC教程)
weixin_39665379
關注
0點贊·410人閱讀
1.什麼是JDBC API,何時使用它?
Java DataBase Connectivity API允許我們使用關系資料庫。JDBC API介面和類是part java.sql和javax.sqlpackage的一部分。我們可以使用JDBC API來獲取資料庫連接,在資料庫伺服器中運行SQL查詢和存儲過程並處理結果。
JDBC API的編寫方式允許我們的Java程序和實際的JDBC驅動程序之間的鬆散耦合,這使我們可以輕松地從一個資料庫切換到另一個資料庫伺服器。
2.JDBC驅動程序有哪幾種類型?
有四種類型的JDBC驅動程序。任何與資料庫一起工作的java程序都有兩個部分,第一部分是JDBC API,第二部分是執行實際工作的驅動程序。
JDBC-ODBC Bridge加ODBC驅動程序(類型1):它使用ODBC驅動程序連接到資料庫。我們應該安裝ODBC驅動程序來連接資料庫,這就是為什麼這個驅動程序幾乎已經過時的原因。
Native API部分支持Java技術的驅動程序(類型2):此驅動程序將JDBC類轉換為資料庫伺服器的客戶端API。我們應該安裝資料庫客戶端API。由於對資料庫客戶端API驅動程序的額外依賴性,這也不是首選驅動程序。
用於資料庫中間件的純Java驅動程序(類型3):此驅動程序將JDBC調用發送到可以連接到不同類型資料庫的中間件伺服器。我們應該安裝一個中間件伺服器來使用這個驅動程序。這增加了額外的網路調用和性能降低,這就是為什麼不廣泛使用JDBC驅動程序。
直接到資料庫的純Java驅動程序(類型4):此驅動程序將JDBC調用轉換為資料庫伺服器可以理解的網路協議。該解決方案簡單,適用於網路上的資料庫連接。但是對於此解決方案,我們應該使用特定於資料庫的驅動程序,例如Oracle for Oracle DB的OJDBC jar和MySQL Connector的MySQL Connector / J.
3.JDBC API如何幫助我們實現Java程序和JDBC驅動程序API之間的鬆散耦合?
JDBC API使用Java Reflection API實現java程序和JDBC驅動程序之間的鬆散耦合。如果你看一個簡單的JDBC例子,你會發現所有的編程都是用JDBC API完成的,而驅動程序只有在通過反射使用Class.forName()方法載入時才會出現。
我認為這是在核心java類中使用Reflection的最佳示例之一,以確保我們的應用程序不能直接使用Drivers API,這使得從一個資料庫移動到另一個資料庫變得非常容易。
4.什麼是JDBC連接?解釋在簡單的java程序中獲取資料庫連接的步驟。
JDBC Connection就像使用資料庫伺服器創建的Session。您還可以將Connection 視為來自資料庫伺服器的Socket連接。
創建JDBC連接非常簡單,需要兩個步驟:
注冊並載入驅動程序:使用Class.forName(),驅動程序類注冊到DriverManager並載入到內存中。
使用DriverManager獲取Connection對象:我們DriverManager.getConnection()通過傳遞資料庫URL字元串,用戶名和密碼作為參數來獲取連接對象。
Connection
5.JDBC DriverManager類有什麼用?
JDBC DriverManager是我們通過它獲取資料庫連接對象的工廠類。當我們載入JDBC Driver類時,它將自己注冊到DriverManager,您可以查找JDBC Driver類源代碼來檢查它。
當我們通過傳遞資料庫配置細節來調用方法DriverManager.getConnection()時,DriverManager使用已注冊的驅動程序來獲取Connection並將其返回給調用者程序。
6.如何在java程序中獲取資料庫伺服器的詳細信息?
我們可以使用DatabaseMetaDataobject來獲取資料庫伺服器的詳細信息。成功創建資料庫連接後,我們可以通過調用getMetaData()方法獲取元數據對象。我們可以使用DatabaseMetaData中的方法來獲取資料庫產品名稱,版本和詳細的配置信息。
DatabaseMetaData
7.什麼是JDBC Statement?
JDBC API Statement用於在資料庫中執行SQL查詢。我們可以通過調用Connection createStatement()方法來創建Statement對象。我們可以使用Statement通過不同的執行方法傳遞查詢來執行靜態SQL查詢,例如execute(),executeQuery(),executeUpdate()等。
由於查詢是在java程序中生成的,如果未正確驗證用戶輸入,則可能導致SQL注入問題,可以在SQL注入示例中找到更多詳細信息。
默認情況下,每個Statement對象只能同時打開一個ResultSet對象。因此,如果我們想要使用多個ResultSet對象,則每個對象必須由不同的Statement對象生成。Statement介面中的所有execute()方法都隱式關閉一個statment的當前ResultSet對象(如果存在open對象)。
8.execute,executeQuery,executeUpdate有什麼區別?
Statement execute(String query)用於執行任何SQL查詢,如果結果是ResultSet(如運行Select查詢),則返回TRUE。當沒有ResultSet對象(如運行Insert或Update查詢)時,輸出為FALSE。我們可以使用getResultSet()獲取ResultSet和getUpdateCount()方法來檢索更新計數。
Statement executeQuery(String query)用於執行Select查詢並返回ResultSet。即使沒有與查詢匹配的記錄,返回的ResultSet也永遠不會為null。執行select查詢時,我們應該使用executeQuery方法,這樣如果有人試圖執行insert / update語句,它將拋出java.sql.SQLException,並顯示消息「executeQuery方法不能用於更新」。
語句executeUpdate(String query)用於執行不返回任何內容的Insert / Update / Delete(DML)語句或DDL語句。輸出為int,等於SQL數據操作語言(DML)語句的行數。對於DDL語句,輸出為0。
只有在不確定語句類型時才應使用execute()方法,否則使用executeQuery或executeUpdate方法。
9.什麼是JDBC PreparedStatement?
JDBC PreparedStatement對象表示預編譯的SQL語句。我們可以使用它的setter方法來設置查詢的變數。
由於PreparedStatement是預編譯的,因此可以使用它多次有效地執行此語句。PreparedStatement是Statement的更好選擇,因為它會自動轉義特殊字元並避免SQL注入攻擊。
10.如何在JDBC PreparedStatement中設置NULL值?
我們可以使用PreparedStatement setNull()方法將null變數綁定到參數。例如,setNull方法將index和SQL Types作為參數 ps.setNull(10, java.sql.Types.INTEGER);。
11.Statement中的getGeneratedKeys()方法有什麼用?
有時,表可以使用自動生成的鍵來插入主鍵的唯一列值。我們可以使用Statement getGeneratedKeys()方法獲取此自動生成密鑰的值。
12.PreparedStatement對Statement有什麼好處?
PreparedStatement對Statement的一些好處是:
PreparedStatement幫助我們防止SQL注入攻擊,因為它會自動轉義特殊字元。
PreparedStatement允許我們使用參數輸入執行動態查詢。
PreparedStatement比Statement快。當我們重用PreparedStatement或使用它的批處理方法執行多個查詢時,它變得更加明顯。
PreparedStatement幫助我們使用setter方法編寫面向對象的代碼,而使用Statement我們必須使用String Concatenation來創建查詢。如果要設置多個參數,則使用字元串連接編寫查詢看起來非常難看並且容易出錯。
13.PreparedStatement的限制是什麼以及如何克服它?
PreparedStatement的一個限制是我們不能直接在IN子句中使用它。將PreparedStatement與IN子句一起使用的一些替代方法是:
執行單一查詢 性能非常慢,不推薦使用
使用存儲過程 特定於資料庫,因此不適用於多個資料庫應用程序。
動態創建PreparedStatement查詢 良好的方法但失去了緩存的PreparedStatement的好處。
在PreparedStatement查詢中使用NULL 當您知道變數輸入的最大數量時,這是一種很好的方法,可以通過部分執行來擴展以允許無限制的參數。可以在JDBC PreparedStatement IN子句替代中找到更詳細的分析。
14.什麼是JDBC ResultSet?
JDBC ResultSet就像一個表示資料庫結果集的數據表,通常通過執行查詢資料庫的語句來生成。
ResultSet對象維護指向其當前數據行的游標。最初,游標位於第一行之前。next()方法將游標移動到下一行。如果沒有更多行,則next()方法返回false,並且可以在while循環中使用它來迭代結果集。
默認的ResultSet對象不可更新,並且只有一個向前移動的游標。因此,您只能迭代一次,並且只能從第一行到最後一行。可以使用以下語法生成可滾動和/或可更新的ResultSet對象。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
當生成它的Statement對象關閉,重新執行或用於從多個結果序列中檢索下一個結果時,ResultSet對象將自動關閉。
我們可以使用ResultSet getter方法,列名或索引號從1開始檢索列數據。
15.ResultSet有哪些不同的類型?
在創建Statement時,我們可以根據用戶輸入獲得不同類型的ResultSet對象。如果您將查看Connection方法,您將看到createStatement()和prepareStatement()方法被重載以提供ResultSet類型和並發作為輸入參數。
ResultSet對象有三種類型。
ResultSet.TYPEFORWARDONLY:這是默認類型,游標只能在結果集中向前移動。
ResultSet.TYPESCROLLINSENSITIVE:游標可以前後移動,結果集對創建結果集後其他人對資料庫所做的更改不敏感。
ResultSet.TYPESCROLLSENSITIVE:游標可以向前和向後移動,結果集對創建結果集後其他人對資料庫所做的更改很敏感。基於並發性,有兩種類型的ResultSet對象。
ResultSet.CONCURREADONLY:結果集是只讀的,這是默認的並發類型。
ResultSet.CONCUR_UPDATABLE:我們可以使用ResultSet更新方法來更新行數據。
16.Statement中的setFetchSize()和setMaxRows()方法有什麼用?
我們可以使用setMaxRows(int i)方法來限制資料庫從查詢返回的行數。您可以使用SQL查詢本身實現相同的功能。例如,在MySQL中,我們可以使用LIMIT子句來設置查詢返回的最大行數。
理解fetchSize可能很棘手,因為你應該知道Statement和ResultSet是如何工作的。當我們在資料庫中執行查詢時,將在資料庫緩存中獲取並維護結果,並返回ResultSet。ResultSet是具有對資料庫中結果的引用的游標。
假設我們有一個返回100行的查詢,並且我們將fetchSize設置為10,因此在每次資料庫訪問時,JDBC驅動程序將只獲取10行,因此將有10次訪問以獲取所有行。如果每行需要大量處理時間並且結果中的行數很大,那麼設置最佳fetchSize會很有幫助。
我們可以通過Statement對象設置fetchSize,但可以通過ResultSet對象setFetchSize()方法覆蓋它。
17.如何使用JDBC API調用存儲過程?
存儲過程是一組SQL查詢,它們在資料庫中編譯,可以從JDBC API執行。JDBC CallableStatement可用於在資料庫中執行存儲過程。初始化CallableStatement的語法是;
CallableStatement
//我們需要在調用存儲過程之前注冊外部參數
stmt
我們需要在執行CallableStatement之前注冊OUT參數。
18.什麼是JDBC批處理,它有什麼好處?
有時我們需要為資料庫運行類似的批量查詢,例如將數據從CSV文件載入到關系資料庫表。我們知道我們可以選擇使用Statement或PreparedStatement來執行查詢。除此之外,JDBC API還提供了批處理功能,通過該功能,我們可以一次性為資料庫執行大量查詢。
JDBC API支持通過Statement和PreparedStatement addBatch()以及executeBatch()方法進行批處理。
批處理比一次執行一個語句更快,因為資料庫調用的數量較少。
19.什麼是JDBC事務管理?我們為什麼需要它?
默認情況下,當我們創建資料庫連接時,它以自動提交模式運行。這意味著無論何時執行查詢並完成查詢,都會自動觸發提交。因此,我們觸發的每個SQL查詢都是一個事務,如果我們運行一些DML或DDL查詢,則每個SQL語句完成後,更改都會保存到資料庫中。
有時我們希望一組SQL查詢成為事務的一部分,以便我們可以在所有查詢運行正常時提交它們,如果我們得到任何異常,我們可以選擇回滾作為事務的一部分執行的所有查詢。
JDBC API提供了一種方法,setAutoCommit(boolean flag)通過該方法我們可以禁用連接的自動提交功能。我們應該僅在需要時禁用自動提交,因為除非我們在連接上調用commit()方法,否則不會提交事務。資料庫伺服器使用表鎖來實現事務管理,這是資源密集型過程。所以我們應該在完成交易後立即提交交易。
20.如何回滾JDBC事務?
我們可以使用Connection對象rollback()方法來回滾事務。它將回滾事務所做的所有更改,並釋放此Connection對象當前持有的所有資料庫鎖。
21.什麼是JDBC Savepoint?如何使用它?
有時,事務可以是多個語句的組,我們希望回滾到事務中的特定點。JDBC Savepoint幫助我們在事務中創建檢查點,並且我們可以回滾到該特定檢查點。
為事務創建的任何保存點都會自動釋放,並在提交事務時或在回滾整個事務時變為無效。將事務滾動回保存點會自動釋放並使在相關保存點之後創建的任何其他保存點無效。
22.什麼是JDBC DataSource?它的好處是什麼?
JDBC DataSource是javax.sql包中定義的介面,它比DriverManager更強大,可用於資料庫連接。我們可以使用DataSource來創建資料庫連接,而Driver實現類可以用來獲取連接的實際工作。除了獲取資料庫連接外,DataSource還提供了一些其他功能,例如:
緩存PreparedStatement以加快處理速度 連接超時設置 記錄功能 ResultSet最大大小閾值 使用JNDI支持在servlet容器中連接池 在JDBC DataSource上閱讀有關DataSource的更多信息。
23.如何在Apache Tomcat Server中使用JDBC DataSource和JNDI實現JDBC連接池?
對於部署在servlet容器中的Web應用程序,創建JDBC連接池非常簡單,只需要幾個步驟。
在容器配置文件中創建JDBC JNDI資源,通常是server.xml或context.xml。例如
server
在Web應用程序中,使用InitialContext查找在第一步中配置的JNDI資源,然後獲取連接。
Context
24.什麼是Apache DBCP API?
如果您使用DataSource獲取資料庫連接,通常用於獲取連接的代碼與特定於驅動程序的DataSource實現緊密耦合。除了選擇DataSource實現類之外,大多數代碼都是樣板代碼。
Apache DBCP通過提供DataSource實現來幫助我們擺脫這些問題,DataSource實現充當我們的程序和不同JDBC驅動程序之間的抽象層。Apache DBCP庫依賴於Commons Pool庫,因此請確保它們都在構建路徑中。
25.什麼是JDBC連接隔離級別?
當我們使用JDBC事務來實現數據完整性時,DBMS使用鎖來阻止其他人訪問事務所訪問的數據。DBMS使用鎖來防止臟讀,不可重復讀和幻像讀問題。
DBMS使用JDBC事務隔離級別來使用鎖定機制,我們可以通過Connection getTransactionIsolation()方法獲取隔離級別信息,並使用setTransactionIsolation()方法設置它。
26.什麼是JDBC RowSet?RowSet有哪些類型?
JDBC RowSet以更靈活的方式保存表格數據,即ResultSet。所有RowSet對象都是從ResultSet派生的,因此它們具有ResultSet的所有功能以及一些其他功能。RowSet介面在javax.sql包中定義。
RowSet提供的一些附加功能包括:
具有屬性的Java Bean及其getter-setter方法。RowSet使用JavaBeans事件模型,它們可以向任何已注冊的組件發送通知,用於事件,例如游標移動,更新/插入/刪除行以及更改為RowSet內容。
默認情況下,RowSet對象是可滾動和可更新的,因此如果DBMS不支持可滾動或可更新的ResultSet,我們可以使用RowSet來獲取這些功能。
RowSet大致分為兩種類型:
已連接的RowSet對象 - 這些對象連接到資料庫,與ResultSet對象最相似。JDBC API僅提供一個連接的RowSet對象javax.sql.rowset.JdbcRowSet,它的標准實現類是com.sun.rowset.JdbcRowSetImpl 斷開連接的RowSet對象 - 這些RowSet對象不需要連接到資料庫,因此它們更輕量級且可序列化。它們適合通過網路發送數據。有四種類型的斷開連接的RowSet實現。
CachedRowSet - 它們可以獲取連接並執行查詢並讀取ResultSet數據以填充RowSet數據。我們可以在數據斷開連接時操作和更新數據,並重新連接到資料庫並寫入更改。WebRowSet派生自CachedRowSet - 它們可以讀寫XML文檔。JoinRowSet派生自WebRowSet - 它們可以形成SQL JOIN而無需連接到數據源。從WebRowSet派生的FilteredRowSet - 我們可以應用過濾條件,以便只有選定的數據可見。
27.ResultSet和RowSet有什麼不同?
RowSet對象派生自ResultSet,因此它們具有ResultSet的所有功能以及一些附加功能。RowSet的一大好處是它們可以斷開連接,使其輕量級,並且易於通過網路傳輸。
是否使用ResultSet或RowSet取決於您的要求,但如果您計劃使用ResultSet更長的持續時間,則斷開連接的RowSet是釋放資料庫資源的更好選擇。
28.常見的JDBC異常有哪些?
一些常見的JDBC異常是:
java.sql.SQLException - 這是JDBC異常的基本異常類。java.sql.BatchUpdateException - 當Batch操作失敗時拋出此異常,但它依賴於JDBC驅動程序是否拋出此異常或基本SQLException。java.sql.SQLWarning - 用於SQL操作中的警告消息。java.sql.DataTruncation - 當數據值因超出MaxFieldSize而被意外截斷時。
29.JDBC中的CLOB和BLOB數據類型是什麼?
字元大對象(CLOB)是由具有關聯代碼頁的單位元組字元組成的字元串。此數據類型適用於存儲面向文本的信息,其中信息量可能超出常規VARCHAR數據類型的限制(上限為32K位元組)。
二進制大對象(BLOB)是由位元組組成的二進制字元串,沒有關聯的代碼頁。此數據類型可以存儲大於VARBINARY(32K限制)的二進制數據。此數據類型適用於存儲圖像,語音,圖形和其他類型的業務或特定於應用程序的數據。
30.什麼是JDBC中的「臟讀」?哪個隔離級別可防止臟讀?
當我們處理事務時,有可能更新行,同時其他查詢可以讀取更新的值。這會導致臟讀,因為更新後的值不是永久性的,已更新行的事務可以回滾到先前的值,從而導致無效數據。
隔離級別TRANSACTIONREADCOMMITTED,TRANSACTION_REPEATABLEREAD和TRANSACTIONSERIALIZABLE阻止了臟讀。
31.什麼是2階段提交?
當我們在涉及多個資料庫的分布式系統中工作時,我們需要使用2階段提交協議。2階段提交協議是分布式系統的原子承諾協議。在第一階段,事務管理器向所有事務資源發送commit-request。如果所有事務資源都正常,則事務管理器將為所有資源提交事務更改。如果任何事務資源響應為Abort,則事務管理器可以回滾所有事務更改。
32.JDBC中有哪些不同類型的鎖定?
從廣義上講,有兩種類型的鎖定機制可以防止數據損壞,因為多個用戶使用相同的數據。
樂觀鎖定 - 使用代碼實現此鎖定。表中引入了一個額外的列以保持更新計數。當您選擇該行時,您也會閱讀此列,比如「version」。現在,當您嘗試更新/刪除行時,將在where子句中傳遞此「version」。因此,如果在其間執行其他線程的更新,則更新將失敗。這是避免數據損壞的好方法,但如果有人錯過更新其更新語句中的「version」,則可能容易出錯。通過這種鎖定方式,更新查詢看起來如下所示。
mysql> update emp SET name = 『David』, version = 5 WHERE id = 10 and version = 4;
悲觀鎖定 - 將記錄從選擇鎖定到讀取,更新和提交階段。這通常由資料庫供應商軟體完成,並通過使用SELECT FOR UPDATE查詢觸發。如果線程處理鎖定較長時間,則這種鎖定行的方式可能導致性能降低和死鎖。
除此之外,一些DBMS系統提供鎖定機制來鎖定單行,表或資料庫。
33.你對DDL和DML語句有什麼了解?
數據定義語言(DDL)語句用於定義資料庫模式。創建,更改,刪除,截斷,重命名語句屬於DDL語句,通常它們不返回任何結果。
數據操作語言(DML)語句用於操縱資料庫模式中的數據。選擇,插入,更新,刪除,調用等是DML語句的示例。
34.java.util.Date和java.sql.Date有什麼區別?
java.util.Date包含有關日期和時間的信息,而java.sql.Date包含僅有關日期的信息,它沒有時間信息。因此,如果您必須在資料庫中保留時間信息,建議使用Timestamp或DateTime欄位。
35.如何將圖像或原始數據插入資料庫?
我們可以使用BLOB將圖像或原始二進制數據插入資料庫。
36.什麼是幻像讀取以及哪種隔離級別阻止了它?
虛擬讀取是指事務多次執行查詢並獲取不同數據的情況。假設事務正在執行查詢以根據條件獲取數據,然後另一個事務插入與條件匹配的行。現在,當同一事務再次執行查詢時,新行將成為結果集的一部分。這個新行被稱為Phantom Row,這種情況稱為Phantom Read。
只有使用TRANSACTION_SERIALIZABLE隔離級別才能阻止幻像讀取。
37.什麼是SQL警告?如何在JDBC程序中檢索SQL警告?
SQLWarning是SQLException的子類,我們可以通過在Connection,Statement和ResultSet對象上調用getWarnings()方法來檢索它。SQL警告不會停止腳本的執行,但會警告用戶警告。
38.如何使用資料庫對象作為IN / OUT調用Oracle存儲過程?
如果Oracle存儲過程具有作為資料庫對象的IN / OUT參數,那麼我們需要在程序中創建相同大小的Object數組,然後使用它來創建Oracle STRUCT對象。然後我們可以通過調用setSTRUCT()方法為資料庫對象設置此STRUCT對象並使用它。
39.我們什麼時候得到java.sql.SQLException:找不到合適的驅動程序?
當SQL URL字元串格式不正確時,您將得到沒有合適的驅動程序發現異常。您可以在使用DriverManager的簡單Java應用程序或使用DataSource的JNDI資源中獲取此異常。異常堆棧跟蹤如下所示。
org
在調試此異常時,只需檢查日誌中列印的URL,如上面的日誌中URL URL是』jdbc:mysql:// localhost:3306 / UserDB,而它應該是jdbc:mysql:// localhost:3306 / UserDB 。
40.JDBC有哪些最佳實踐?
一些JDBC最佳實踐是:
資料庫資源很重,因此請確保在完成後立即關閉它。Connection,Statement,ResultSet和所有其他JDBC對象都定義了close()方法來關閉它們。
始終在代碼中顯式關閉結果集,語句和連接,因為如果您在連接池環境中工作,則可能會將連接返回到池,從而導致打開的結果集和語句對象導致資源泄漏。
關閉finally塊中的資源,以確保即使在異常情況下它們也會關閉。
使用批處理進行類似的批量操作。
始終對Statement使用PreparedStatement以避免SQL注入並獲得PreparedStatement的預編譯和緩存優勢。
如果要將批量數據檢索到結果集中,則為fetchSize設置最佳值有助於獲得良好的性能。
資料庫伺服器可能不支持所有隔離級別,因此請在假設之前進行檢查。
更嚴格的隔離級別會導致性能降低,因此請確保為資料庫連接設置了最佳隔離級別。
如果要在Web應用程序中創建資料庫連接,請嘗試使用JNDI上下文使用JDBC DataSource資源來重用連接。
當您需要長時間使用ResultSet時,請嘗試使用斷開連接的RowSet。