JDBC 事物處理

JDBC 事物處理

?事務:指構成單個邏輯工作單元的操作集合

?事務處理:保證所有事務都作為一個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在一個事務中執行多個操作時,要么所有的事務都被提交(commit),要么整個事務回滾(rollback)到最初狀態

?當一個連接對象被創建時,默認情況下是自動提交事務:每次執行一個SQL 語句時,如果執行成功,就會向數據庫自動提交,而不能回滾

?為了讓多個SQL 語句作為一個事務執行:

? –調用 Connection對象的 setAutoCommit(false);以取消自動提交事務

? –在所有的 SQL 語句都成功執行后,調用commit();方法提交事務

? –在出現異常時,調用rollback();方法回滾事務

? –若此時 Connection沒有被關閉, 則需要恢復其自動提交狀態

數據庫提供的4種事務隔離級別:

這里寫圖片描述

在MySql中設置隔離級別

?每啟動一個 mysql程序,就會獲得一個單獨的數據庫連接.每個數據庫連接都有一個全局變量@@tx_isolation,表示當前的事務隔離級別.MySQL默認的隔離級別為RepeatableRead

?查看當前的隔離級別:SELECT @@tx_isolation;

?設置當前mySQL連接的隔離級別:

? –set transaction isolation level readcommitted;

?設置數據庫系統的全局的隔離級別:

? -set global transaction isolation level read committed;

批量處理JDBC語句提高處理速度

?當需要成批插入或者更新記錄時。可以采用Java的批量更新機制,這一機制允許多條語句一次性提交給數據庫批量處理。通常情況下比單獨提交處理更有效率

?JDBC的批量處理語句包括下面兩個方法:

? –addBatch(String):添加需要批量處理的SQL語句或是參數;

? –executeBatch();執行批量處理語句;

?通常我們會遇到兩種批量執行SQL語句的情況:

? –多條SQL語句的批量處理;一個SQL語句的批量傳參;

? 這里寫圖片描述

JDBC數據庫連接池的必要性

?在使用開發基于數據庫的web程序時,傳統的模式基本是按以下步驟:  

? –在主程序(如servlet、beans)中建立數據庫連接。

? –進行sql操作

? –斷開數據庫連接。

?這種模式開發,存在的問題:

? –普通的JDBC數據庫連接使用DriverManager 來獲取,每次向數據庫建立連接的時候都要將 Connection加載到內存中,再驗證用戶名和密碼(得花費0.05s~1s的時間)。需要數據庫連接的時候,就向數據庫要求一個,執行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。數據庫的連接資源并沒有得到很好的重復利用.若同時有幾百人甚至幾千人在線,頻繁的進行數據庫連接操作將占用很多的系統資源,嚴重的甚至會造成服務器的崩潰。

? –對于每一次數據庫連接,使用完后都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將導致重啟數據庫。

? –這種開發不能控制被創建的連接對象數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致內存泄漏,服務器崩潰。

數據庫連接池(connection pool)

?為解決傳統開發中的數據庫連接問題,可以采用數據庫連接池技術。

?數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。

?數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個。

?數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。

這里寫圖片描述

數據庫連接池技術的優點

?資源重用:

–由于數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。

?更快的系統反應速度

–數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間

?新的資源分配手段

–對于多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨占所有的數據庫資源

?統一的連接管理,避免數據庫連接泄露

–在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露

兩種開源的數據庫連接池

?JDBC的數據庫連接池使用javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere,Tomcat)提供實現,也有一些開源組織提供實現:

? –DBCP 數據庫連接池

? –C3P0 數據庫連接池

?DataSource 通常被稱為數據源,它包含連接池和連接池管理兩個部分,習慣上也經常把DataSource 稱為連接池

DBCP數據源

?DBCP 是 Apache軟件基金組織下的開源連接池實現,該連接池依賴該組織下的另一個開源系統:Common-pool.如需使用該連接池實現,應在系統中增加如下兩個jar 文件:

? –Commons-dbcp.jar:連接池的實現

? –Commons-pool.jar:連接池實現的依賴庫

?Tomcat的連接池正是采用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用。

DBCP數據源使用范例

?數據源和數據庫連接不同,數據源無需創建多個,它是產生數據庫連接的工廠,因此整個應用只需要一個數據源即可。

?當數據庫訪問結束后,程序還是像以前一樣關閉數據庫連接:conn.close(); 但上面的代碼并沒有關閉數據庫的物理連接,它僅僅把數據庫連接釋放,歸還給了數據庫連接池。

? 這里寫圖片描述

C3P0數據源

? 這里寫圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250490.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos6上安裝mysql8.0版本

本博客是采用yum源的方式安裝,非常的方便和快捷。(redhat 與centos7 等操作系統都可以采用此方法,步驟大體一致) mysql官網地址: https://dev.mysql.com 開始安裝: 1.清理環境,查看有沒有之前安裝過的mysql記錄,清理…

koa --- 使用koa-multer上傳文件+elementUI

核心代碼 const upload require(koa-multer) ({dest: ./public/images}); router.post(/upload, upload.single(file), ctx>{console.log(file, ctx.req.file);console.log(body, ctx.req.body);ctx.body 上傳成功; })目錄結構如下 基本思路 1.通過瀏覽器訪問url: http:…

[bzoj4003][JLOI2015]城池攻占_左偏樹

城池攻占 bzoj-4003 JLOI-2015 題目大意:一顆n個節點的有根數,m個有初始戰斗力的騎士都站在節點上。每一個節點有一個standard,如果這個騎士的戰斗力超過了這個門檻,他就會根據城池的獎勵增加自己的戰斗力。具體地:每一…

Java Web Servlet

Java Web Servlet Servlet是在服務器上運行的小程序。一個Servlet就是一個Java類,并且可以通過“請求-響應”編程模型來訪問的這個駐留在服務器內存里的Servlet程序。 Servlet可完成以下功能: 讀取客戶端(瀏覽器)發送的顯式的數…

第二篇 python基礎知識總結:數據、運算符

引子 我們跟任何人交流,說的每一句都是都一些文字組成,包含名詞、動詞、語句、標點符號等,組成我們說普通話構成的基本要素。同理我們學習python語言也要明白這些基本要素,也就是我們常說的基本語法,這是我們必須掌握的…

【BZOJ1797】[AHOI2009]最小割(網絡流)

【BZOJ1797】[AHOI2009]最小割(網絡流) 題面 BZOJ洛谷 題解 最小割的判定問題,這里就當做記結論吧。(源自\(lun\)的課件) 我們先跑一遍最小割,求出殘量網絡。然后把所有還有流量的邊拿出來跑\(Tarjan\)縮\(…

koa --- 使用Sequelize連接mysql

Sequelize介紹 為了快捷開發,社區出現了一系列的ORM(Object Relational Mapping)類庫ORM的字面意思為對象關系映射,它提供了概念性的、易于理解的模型化數據的方法。通過ORM,可以降低操作數據庫的成本。開發者不需要通過編寫SQL腳本來操作數據庫,直接通過訪問對象的方式來查詢…

Java Web Jsp

Java Web Jsp JSP全稱Java Server Pages&#xff0c;是一種動態網頁開發技術。它使用JSP標簽在HTML網頁中插入Java代碼。標簽通常以<%開頭以%>結束。 JSP是一種Java servlet&#xff0c;主要用于實現Java web應用程序的用戶界面部分。網頁開發者們通過結合HTML代碼、XHT…

Android gravity和layout_gravity的區別

一、gravity和layout_gravity相同處 兩者都是設置對齊方式的屬性。內部的屬性值相同。 根據英文意思也能理解其中的意思。如center_horizontal表示在水平方向上的位置為中間。 二、gravity和layout_gravity的不同處 gravity是設置自身內部元素的對齊方式。比如一個TextView&…

koa --- mongoose連接mongoDB

使用Mongoose對MongoDB進行操作 const mongoose require(mongoose); mongoose.connect(mongodb://localhost/test,{ })Mongoose中的Schema 定義Schema categorySchema const categorySchema new mongoose.Schema({name:String,description: String,createdAt:{type: Date,…

Java Web 請求轉發與請求重定向

Java Web 請求轉發與請求重定向 請求轉發 服務器行為&#xff0c;即用戶向服務器發送了一次http請求&#xff0c;該請求可能會經過多個信息資源處理以后菜返回給用戶&#xff0c;各個信息資源使用請求轉發機制互相轉發請求&#xff0c;但是用戶是感覺不到請求轉發的。通過req…

05.RDD詳解

05.Spark--RDD詳解 RDD詳解--groupByKey--reduceByKey [MapPartitionRDD單詞統計] 單詞統計 import org.apache.spark.{SparkConf,SparkContext} object WordCountScala{def main(args:Array[String]):Unit{//創建spark配置對象val confnew SparkConf()conf.setAppName("W…

Mininet

首先&#xff0c;我折騰了兩周多的東西終于弄出一點眉目了。 有以下幾個內容需要學習記憶一下。 1.虛擬機&#xff0c;弄不出來共享文件夾&#xff0c;就用U盤吧&#xff0c;賊快還不用安裝配置各種東西&#xff0c;virtualbox和VMware都支持。 2.ubantu安裝軟件中途失敗&#…

docker --- 使用docker-compose.yml生成redis,并連接redis-cli

docker.compose.yml 配置 version: 3.1 services:redis:image: redisports:- 6379:6379命令行:docker-compose up 查看: docker ps 進入redis-cli,輸入以下 docker exec -it 7dc0a redis-cli -h localhost -p 6379 操作Redis數據 設置 namemarron set name marron 獲取nam…

淺談javaweb三大框架和MVC設計模式

淺談javaweb三大框架和MVC設計模式轉載自&#xff1a;http://blog.csdn.net/sunpeng19960715/article/details/50890705 小序&#xff1a;博主以前在學javaweb的時候開始總不理解javaweb三大框架和MVC框架模式&#xff0c;雖然沒有把兩者混為一談&#xff0c;但是也是很暈菜。…

win下配置nginx

1.下載:http://nginx.org/en/download.html 2.在安裝目錄cmd: start nginx.exe 啟動nginx 3.修改默認運行端口80(nginx.conf): HTTP 數據分發 修改配置文件nginx.conf相應節點: 修改完后重啟服務: nginx -s reload TCP 數據分發: nginx 1.9以上版本支持tcp轉發 配置文件中增加:…

在springBoot中配置web.xml中配置的servlet

第一種 web.xml (截取的需要轉換的) 當攔截到 /socke t時執行該servlet <servlet><servlet-name>websocket</servlet-name><servlet-class>org.ldd.ssm.hangyu.socket.MyWebSocketServlet</servlet-class></servlet><servlet-mapping&g…

koa --- koa-bouncer驗證

使用 koa-bouncer中間件對傳入的數據進行驗證 const bouncer require(koa-bouncer); app.use(bouncer.middleware());const val async (ctx, next) > {ctx.validateBody(name).required(要求提供用戶名).isLength(6, 16, 用戶名長度應該為6~16).isString().trim()next();…

static關鍵字的作用

//C/C程序員面試指南 楊國祥等編著 定義全局靜態變量。全局靜態變量有以下特點&#xff1a; 在全局數據區分配內存&#xff1b;如果沒有初始化&#xff0c;其默認值為0&#xff1b;該變量在本文件內從定義開始到文件結束可見。定義局部靜態變量。局部靜態變量有以下特點&…

Redis 初次嘗試

Redis 初次嘗試 第一次接觸redis&#xff0c;也不知道要寫些什么。就玩了下將redis列表中的數據存入mysql數據庫中。 首先有三個文件&#xff1a; redis.php 添加數據進redis&#xff1b; insert_class.php 將數據插入數據庫&#xff1b; inert.php 調用insert_class.php;…