<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
DataSource是作為DriverManager的替代品而推出的,DataSource 物件是獲取連線的首選方法。
DriverManager負責管理驅動程式,並且使用已註冊的驅動程式進行連線。
//1、註冊驅動 Class.forName("com.mysql.jdbc.Driver"); //資料庫連線所需引數 String user = "root"; String password = "123456"; String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8"; //2、獲取連線物件 Connection conn = DriverManager.getConnection(url, user, password);
使用DriverManager的一般形式如上面程式碼所示
直接使用DriverManager的這種形式,通常需要將驅動程式寫死到專案中(JDBC4.0後可以自動註冊驅動程式)
而且最重要的是DriverManager的getConnection方法獲取的連線,是建立與資料庫的連線,是建立與資料庫的連線,是建立與資料庫的連線。
但是建立與資料庫的連線是一項較耗資源的工作,頻繁的進行資料庫連線建立操作會產生較大的系統開銷。
隨著企業級應用複雜度的提升以及對效能要求的提高,這一點是難以接受的。
既然每次使用時都重新建立與資料庫之間的連線,會產生較大的系統開銷
是否可以事先建立一些連線備用,當需要時,從這些連線中選擇一個提供出去;當連線使用完畢後,並不是真正的關閉,而是將這些資料狀態還原,然後繼續等待下一個人使用?
比如滑雪場會租賃雪具滑雪服等,如果你不是資深玩家,你沒有必要浪費錢買,即使你不差錢,每次去滑雪場都不能輕裝上陣,每次都要攜帶很多裝備,也是一件麻煩事。
這種沒必要的花費或者麻煩其實都是一種開銷。
連線池的核心與租用的理念有類似的點,重複使用可以提高連線的利用率,減少開銷(當然連線池的使用並不需要你花費一筆租金)
連線的持有是消耗空間的,但是現在絕大多數場景下,磁碟空間並沒有那麼金貴,我們更關心的是效能,所以空間換取時間,連線池的邏輯被廣泛應用。
DriverManager只是建立與資料庫之間的連線,如何才能將連線池的概念應用其中?
一種很自然的方式就是提供一個薄層的封裝,建立一箇中間層,這個中間層將DriverManager生成的連線,組織到連線池中,然後從池中提供連線。
Data Source就是DriverManager的一種替代角色,對外呈現就類似於一個DriverManager,擁有對外提供連線的能力直接使用DriverManager,驅動程式與管理器是“服務者---管理者”的形式,藉助於管理者才能提供服務。Data Source將驅動程式的概念淡化了,突出驅動程式能夠提供的服務與能力,將驅動程式提供的服務與能力抽象為Data Source資料來源這一角色。
DataSource中獲取的連線來自於連線池中,而池中的連線根本也還是從DriverManager獲取而來
有了資料來源這一中間層,就可以實現連線池和分散式事務的管理。
對外呈現DataSource就是類似於DriverManager的一個存在。
DataSource的形式是JNDI (Java Naming Directory Interface)
DataSource是JNDI資源的一種,那麼到底什麼是JNDI呢
此處不過多解釋,可以簡單認為JNDI是類似這樣一個東西:
一個雜湊表,型別為<String,Object>
JNDI的兩個最主要操作:bind和lookup。bind操作負責往雜湊表裡存物件,lookup則根據這個鍵值字串往外取物件。
開發人員可以使用鍵值——也就是一個字串名稱——來獲取某個物件。
簡言之就是可以給一個物件命名,然後可以通過名稱找到這個物件。
資料來源的概念在應用程式與資料庫連線之間插入了一箇中間層,進而可以實現連線池以及事務管理,並且以JNDI的形式,也能夠以非常方便的形式使用。
關於資料來源有以下幾個核心的介面
CommonDataSource介面定義了 DataSource、XADataSource 和 ConnectionPoolDataSource 之間公用的方法。
DataSource 是 官方定義的獲取 connection 的介面, ConnectionPoolDataSource 是官方定義的從 connection pool 中拿 connection 的介面,XADataSource是定義的用來獲取分散式事務連線的介面
也就是分為了三個方向,基本實現,連線池,事務
對於ConnectionPoolDataSource的使用方案應該是下面所示
對於Connection Pool的實現,藉助於ConnectionPoolDataSource,進而獲取PooledConnection ,然後獲取連線,這是一種標準做法
但是有的時候 事情的發展或許並不一定如規劃的那般發展
很多的工具類僅僅實現DataSource了,也一併實現連線池以及事務的能力,介面就在那裡,我直接實現一個強大的實現類,也沒什麼問題
這是一個工廠物件,用於提供到此 DataSource 物件所表示的物理資料來源的連線。
作為 DriverManager 工具的替代項,DataSource 物件是獲取連線的首選方法。
實現 DataSource 介面的物件通常在基於 JavaTM Naming and Directory Interface (JNDI) API 的命名服務中註冊。
DataSource 介面由驅動程式供應商實現。共有三種型別的實現:
DataSource 物件的屬性在必要時可以修改。
例如,如果將資料來源移動到另一個伺服器,則可更改與伺服器相關的屬性。其優點在於,由於可以更改資料來源的屬性,所以任何存取該資料來源的程式碼都無需更改。
通過 DataSource 物件存取的驅動程式本身不會向 DriverManager 註冊。
通過lookup操作獲取 DataSource 物件,然後使用該物件建立 Connection 物件。
使用基本的實現,通過 DataSource 物件獲取的連線與通過 DriverManager 設施獲取的連線相同。
資料來源的實現必須提供public的無參的建構函式。
DataSource只有兩個方法(確切的說是一個方法的兩個過載版本),用於建立與此 DataSource 物件所表示的資料來源的連線。
DriverManager用於管理驅動程式並且提供資料庫的直連,頻繁的建立和消耗連線增加系統大量開銷,並且將資料庫連線直接暴露。
資料來源的概念就是為了在應用程式和DriverManager建立的資料庫直接連線之間插入一箇中間層
藉助於中間層,應用程式與資料庫的連線兩者之間完成了解耦,也能夠對資料庫的真實連線進行隱藏;
一旦解耦,通過中間層間接呼叫,類似代理模式,就可以新增更多的服務---連線池以及分散式事務。
資料來源相關介面有三個,但是很多是僅僅實現了DataSource介面
而對於連線池本質就是一個容器,負責管理建立好的資料庫連線。
連線池與資料來源邏輯上是兩回事,但是在實現層面的程式碼中DataSource的實現類往往都具有了連線池以及連線池管理方面的功能。
所以有些時候,DataSource到底是理解成資料來源?還是javax.sql.DataSource?還是指的一個實現?還是一個實現了資料庫連線池的實現?(經常一個實現了DataSource的並且提供了連線池功能的實現,會被叫做資料庫連線池)
Java作為一種廣泛使用的開發語言,自然不需要我們自己實現DataSource,一些大廠已經幫我們實現了
比如:DBCP ,C3P0 ,druid
下面的三張圖展示了類繼承結構,可以看得出來他們實現的介面
目前推薦使用ALI的Druid,http://druid.io/
maven中央倉庫: http://central.maven.org/maven2/com/alibaba/druid/
Druid是一個開源專案,原始碼託管在github上,原始碼倉庫地址是 https://github.com/alibaba/druid。
Wiki首頁:
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
與其他主流對比
如下一個簡單的演示
package jdbc; import com.alibaba.druid.pool.DruidDataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import org.apache.commons.dbcp2.BasicDataSource; public class MyDataSource { public static void main(String[] args) throws Exception { String user = "root"; String password = "123456"; String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8"; //1.獲取連線 // Connection conn = getDHCPConnection(user,password,url); //Connection conn = getC3P0Connection(user,password,url); Connection conn = getDruidConnection(user, password, url); String sql = "select * from student limit 0,10"; //2、獲得sql語句執行物件 Statement stmt = conn.createStatement(); //3、執行並儲存結果集 ResultSet rs = stmt.executeQuery(sql); //4、處理結果集 while (rs.next()) { System.out.print("id:" + rs.getInt(1)); System.out.print(",姓名:" + rs.getString(2)); System.out.print(",年齡:" + rs.getInt(3)); System.out.println(",性別:" + rs.getString(4)); } conn.close(); stmt.close(); rs.close(); } public static Connection getDruidConnection(String user, String password, String url) throws Exception { DruidDataSource ds = new DruidDataSource(); ds.setUsername(user); ds.setPassword(password); ds.setUrl(url); ds.setDriverClassName("com.mysql.jdbc.Driver"); return ds.getConnection(); } public static Connection getC3P0Connection(String user, String password, String url) throws Exception { ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setUser(user); cpds.setPassword(password); cpds.setJdbcUrl(url); cpds.setDriverClass("com.mysql.jdbc.Driver"); return cpds.getConnection(); } public static Connection getDHCPConnection(String user, String password, String url) throws Exception { BasicDataSource dataSource = new BasicDataSource(); dataSource.setUsername(user); dataSource.setPassword(password); dataSource.setUrl(url); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); Connection connection = dataSource.getConnection(); return connection; } }
資料來源作為DriverManager的替代者,用於獲取資料庫連線,你應該總是使用DataSource
DataSource是應用程式與資料庫連線的一個抽象的中間層,是一個介面
對於DataSource已經有了很多優秀的實現,其中較為突出的為Druid,建議使用,Druid不僅僅提供了連線池的功能還提供了其他比如監控等功能,非常強大。
對於資料來源的應用,除了使用者名稱密碼url還有其他的一些屬性資訊,比如最大連線數,建立連線的最大等待時間等,不同的連線池略微有出入,可以檢視手冊。
對於DataSource的一些實現,經常被叫做資料庫連線池,比如Druid官方檔案中說“Druid是Java語言中最好的資料庫連線池“,本質核心就是DataSource的一個實現類,作為中間層使用,並且基本上都提供了附帶的其他的服務,也就是說不僅僅實現了核心建築,也基於核心之上構建了很多的外圍建設。
到此這篇關於Data Source與資料庫連線池簡介(JDBC簡介)的文章就介紹到這了,更多相關資料庫連線池Data Source內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45