1. 程式人生 > >ThreadLocal在資料庫連線中的應用

ThreadLocal在資料庫連線中的應用

之前一直覺得ThreadLocal沒用,後來看到別人在資料庫連線中的相關講解後發現這個類真的很實用。

在資料庫連線中為了提高伺服器的響應速度,通常都會採用資料庫連線池的方式來獲取資料庫連線。

C3P0Utils實現

public class C3P0Utils {

	private static DataSource source;//資料來源
	static{
		source = new ComboPooledDataSource("mysql");//根據配置檔案初始化資料來源
	}
	
	/**
	 * 獲取資料庫連線
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		return source.getConnection();
	}
}


上面的程式碼是使用C3P0連線池獲取資料庫連線的工具類,其中DataSource是jdk內建的資料庫連線池介面,也可以說是sun公司制定的關於資料庫連線池的一套標準,任何資料庫連線池都要實現該介面。

TransactionThreadLocal 實現

public class TransactionThreadLocal {

	private static ThreadLocal<Connection> tc = new ThreadLocal<>();
	/**
	 * 返回當前執行緒的資料庫連線
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		Connection connection = tc.get();
		if(connection == null){
			connection = C3P0Utils.getConnection();
			tc.set(connection);
		}
		return connection;
	}
	
	/**
	 * 開啟事務
	 * @throws SQLException
	 */
	public static void startTransaction() throws SQLException{
		getConnection().setAutoCommit(false);
	}
	/**
	 * 提交事務
	 * @throws SQLException
	 */
	public static void commit() throws SQLException{
		getConnection().commit();
	}
	
	/**
	 * 事務回滾
	 * @throws SQLException
	 */
	public static void rollback() throws SQLException{
		getConnection().rollback();
	}
	
	/**
	 * 關閉資料庫
	 * @throws SQLException
	 */
	public static void close() throws SQLException{
		getConnection().close();//關閉資料庫
		tc.remove();//將該執行緒的connection物件移除
	}
}

這個類是用來操作資料庫連線的一個工具類。

getConnection()方法是獲取當前執行緒Connection物件的一個方法。ThreadLocal類中有一個get()方法,該方法用來獲取當前執行緒的儲存的ThreadLocal中的物件,每個執行緒儲存的是該物件的一個副本,不同執行緒之間不會互相影響,一個執行緒對該物件的修改不會影響其他執行緒中該物件的值。set(T value)方法用來設定當前執行緒的該物件的值。

使用ThreadLocal物件來儲存Connection物件有一個好處,它可以保證當前執行緒中任何地方的Connection資料庫連線都是相同的。我們知道資料庫操作中事務是使用比較頻繁的一個東西,一個事務中包含多個數據庫操作,我們必須保證一個事務中所有操作所使用的Connection物件

是相同的,通常情況下我們會選擇將Connection物件作為引數傳入相應的資料庫操作方法中,這樣做比較麻煩。

public class BookDaoImp implements BookDao{
 @Override
	public void edit(Book book) throws Exception {
		Connection conn = TransactionThreadLocal.getConnection();
		String sql = "update book set name=? where id=?";
		PreparedStatement pst = conn.prepareStatement(sql);
		pst.setString(1, "name");
		pst.setString(2, id);
		pst.execute();
	}
}
上面的類中的edit方法使用的Connection物件是使用TransactionThreadLocal類的getConnection()方法獲取的,而不需要將Connection物件傳入,這樣可以使程式碼更加健壯。

相關推薦

ThreadLocal資料庫連線應用

之前一直覺得ThreadLocal沒用,後來看到別人在資料庫連線中的相關講解後發現這個類真的很實用。 在資料庫連線中為了提高伺服器的響應速度,通常都會採用資料庫連線池的方式來獲取資料庫連線。 C3P0Utils實現 public class C3P0Utils { pr

資料庫連線應用資料庫伺服器斷開超時連線的問題

資料庫應用開發過程中,我們可能會遇到一個問題:應用使用了資料庫連線池,每經過指定時間後,發出到資料庫伺服器的任何請求都會失敗,而且有且僅有一次失敗,之後的正常訪問都沒有問題。尤其是在Web應用中,如果晚上時段沒有訪問,而第二天第一個訪客的經歷就是碰到一個數據庫訪問錯誤,

資料庫連線使用PreparedStatement預編譯防止SQL注入

//使用預編譯不需要對SQL語句進行拼接,而是使用?佔位符,因此可以防止SQL注入,提升了安全性。 1.提高程式碼可讀性和可維護性 2.提高sql語句執行效能 3.提高安全性 PreparedS

3.5 單例模式在資料庫連線池管理的實際應用

目前大多數程式開發都需要用到資料庫連線池,在資料庫連線池的管理類中,就使用了單例模式,來實現對連線池的管理。這裡模擬一個連線池的 管理類Manager.java,它的示意程式碼如下: //***Manage.java********************

JAVA和C#資料庫連線池原理與應用

JAVA和C#中資料庫連線池原理 在現在的網際網路發展中,高併發成為了主流,而最關鍵的部分就是對資料庫操作和訪問,在現在的網際網路發展中,ORM框架曾出不窮, 比如:.Net-Core的EFCore、SqlSugar、Dapper。JAVA的Spring-DataJpa(EntityManager),Myba

Spring配置檔案如何使用外部配置檔案配置資料庫連線

版權宣告:本文為博主原創文章,歡迎指正或者轉載。 https://blog.csdn.net/qq_38663729/article/details/78821258 直接在spring的配置檔案中applicationContext.xml檔案中配置資料庫連線也可以,但是有個問題,需要在url

Spring配置檔案配置資料庫連線(mysql,sqlserver,oracle)

xml配置檔案中配置如下: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"

Maven專案oracle資料庫連線不上(已經在pom檔案配置jdbc驅動檔案)

在Maven專案中配置資料庫連線的過程中,出現java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver: 但是檢查了很久都沒有發現哪裡出現錯誤,該配置的都配置了,然後在百度找了一下,發現是oracle版本不同造成的: 參

使用Mysql8資料庫連線錯誤的解決辦法

錯誤日誌 這個問題的根本原因是資料庫連線池的版本過低,所以更新依賴 2018-11-10 11:06:40.441 ERROR 10575 --- [eate-2090142523] com.alibaba.druid.pool.DruidDataSource : create

ThreadLocal解決事務執行緒安全問題(c3p0資料庫連線池工具類)

ThreadLocal底層是Map集合,它的key是當前執行緒,value由自己設定,可以繫結Connection或其他物件等,保證本次同一執行緒使用同一Connection。 ThreadLocal類提供幾個方法: get/set/remove 以下是ThreadLocal搭配c3p

docker的mysql資料庫連線不上解決辦法

1.在docker內部連線不上mysql資料庫 即在本地模式下不能連線 這時候應該是docker容器重啟過,mysql資料庫沒有啟動的原因,可以使用 service mysql restart 來啟動mysql資料庫 2.在宿主機上不能遠端連線到docker容器中的mysql資料

oracle12C資料庫JSON的應用 --PL/SQL儲存過程JSON解析應用

最近有些專案在資料庫oracle中使用到json格式的資料互動,對於oracle12以上的版本都支援JSON格式資料的使用,剛剛接觸的猿們可以到上一篇oracle資料庫使用json的簡單入門,最好參考官方的API文件關於oracle官方API文件對JSON的支援; 下面就比較詳細的說一下,關

Servlet(ServletContext配置全域性引數、ServletContext方法、屬性檔案獲取資料庫連線引數)

通過ServletContext物件獲取資料庫全域性配置在web.xml中的連線引數的值 配置檔案web.xml中的程式碼 <!-- 這是全域性的資料庫連線引數配置 --> <context-param> <param-name>

資料庫連線池原理及應用

1、運作原理 在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用 JDBC直接訪問資料庫中的資料,每一次資料訪問請求都必須經歷建立資料庫連線、開啟資料庫、存取資料和關閉資料庫連線等步驟,而連線並開啟資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操作,系

【潤乾報表5】資料庫密碼含有特殊字元潤乾應用部署時xml怎麼處理

問題舉例:     資料庫密碼中含有<字元,報表設計器下配置資料來源時,設計器會自動將這些特殊字元進行轉換,然而如果當我們在專案部署或整合時扔按照常規的配置,配置資料庫連線池時,會發現訪問報表時網頁出現如下報錯資訊: 問題總結:        經排查發現xml檔案

基於JDBC的資料庫連線池技術研究與應用

       近年來,隨著Internet/Intranet建網技術的飛速發展和在世界範圍內的迅速普及,計算機 應用程式已從傳統的桌面應用轉到Web應用。基於B/S(Browser/Server)架構的3層開發模式逐漸取代C/S(Client/Server)架構的開發模式,成為開發企業級應用和電子商務普遍採用

hibernate 資料庫連線操作

hibernate.cfg.xml  中配置 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate

Java 使用動態代理和觀察者模式+threadlocal實現資料庫連線

當我們使用資料庫連線池時,如果多執行緒連線資料庫時,當超過5個執行緒連線資料庫時,那麼在第6個執行緒包括之後就連線不到資料庫了,該怎麼處理。 這裡用了java動態代理來這裡用了java的動態代理來代理資料庫的連線,攔截連線的close方法。並且給代理的連線加上一

flask的CBV,flash,Flask-Session,WTForms - MoudelForm,DBUtils 資料庫連線

CBV和flash from flask import Flask,request,render_template,redirect,url_for,flash,get_flashed_messages from flask import views app = Flask(__name__) #

jbdc 資料庫連線 和 properties配置檔案讀取 結合應用

web應用避不開與資料庫的互動,熟悉資料庫的連線和配置有利於更快捷方便的操作資料庫和應用的協作,保證應用效能的穩定;   資料庫jdbc連線: 1:常見資料庫連線驅動: mysql:  驅動程式包名:mysql-connector-java-5.1.26-bin.