日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分

發布時間:2024/4/14 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是ThreadLocal

早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal為解決多線程程序的并發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多線程程序。

ThreadLocal很容易讓人望文生義,想當然地認為是一個“本地線程”。其實,ThreadLocal并不是一個Thread,而是Thread的局部變量,也許把它命名為ThreadLocalVariable更容易讓人理解一些。

當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。

從線程的角度看,目標變量就象是線程的本地變量,這也是類名中“Local”所要表達的意思。

線程局部變量并不是Java的新發明,很多語言(如IBM IBM XL FORTRAN)在語法層面就提供線程局部變量。在Java中沒有提供在語言級支持,而是變相地通過ThreadLocal的類提供支持。

所以,在Java中編寫線程局部變量的代碼相對來說要笨拙一些,因此造成線程局部變量沒有在Java開發者中得到很好的普及。

ThreadLocal的接口方法

ThreadLocal類接口很簡單,只有4個方法,我們先來了解一下:

2??void set(Object value)

設置當前線程的線程局部變量的值。

2??public Object get()

該方法返回當前線程所對應的線程局部變量。

2??public void remove()

將當前線程局部變量的值刪除,目的是為了減少內存的占用,該方法是JDK 5.0新增的方法。需要指出的是,當線程結束后,對應該線程的局部變量將自動被垃圾回收,所以顯式調用該方法清除線程的局部變量并不是必須的操作,但它可以加快內存回收的速度。

2??protected ObjectinitialValue()

返回該線程局部變量的初始值,該方法是一個protected的方法,顯然是為了讓子類覆蓋而設計的。這個方法是一個延遲調用方法,在線程第1次調用get()或set(Object)時才執行,并且僅執行1次。ThreadLocal中的缺省實現直接返回一個null。

值得一提的是,在JDK5.0中,ThreadLocal已經支持泛型,該類的類名已經變為ThreadLocal<T>。API方法也相應進行了調整,新版本的API方法分別是void set(T value)、T get()以及T initialValue()。

一、來看一個實際案例

2.1?同一Service方法中調用多個Dao方法

可以看到,我們有一個Service方法,在該Service方法中調用多個Dao方法,所有在該Service方法中的的Dao都處于同一事務中。

該Service方法結束后,提交事務;

該Service方法中有任何錯,回滾事務;

2.2?傳統的做法

來看下面這段偽代碼

Service層代碼:

public void serviceMethod(){

Connection conn=null;

try{

Connection conn=getConnection();

conn.setAutoCommit(false);

Dao1 dao1=new Dao1(conn);

dao1.doSomething();

Dao2 dao2=new Dao2(conn);

dao2.doSomething();

Dao3 dao3=new Dao3(conn);

dao3.doSomething();
??????? conn.commit();

}catch(Exception e){

??? try{

??? conn.rollback();

}catch(Exception ex){}

}finally{

try{

conn.setAutoCommit(true);

}catch(Exception e){}

??? try{

??? if(conn!=null){

??? conn.close();

??? conn=null;

}

}catch(Exception e){}

}

}

每個Dao層的代碼:

Class Dao1{

private Connection conn=null;

public Dao1(Connection conn){

??? this.conn=conn;

}

public void doSomething(){

??? PreparedStatement pstmt=null;

??? try{

??????? pstmt=conn.preparedStatement(sql);

??????? pstmt.execute…

??????? …

}catch(Exception e){

??? log.error(e,”Exeception occurred in Dao1.doSomething():”+e.getMessage,e);

}finally{

??? try{

??????? if(pstmt!=null){

??????????? pstmt.close();

??????????? pstmt=null;

}

??? }catch(Exception e){}

}

}

}

如果我一個Service方法有調用一堆dao方法,先不說這樣寫首先破壞了OOP的封裝性原則,如果有一個dao多關了一個conn,那就會導致其它的dao得到的conn為null,這種事在這樣的寫法下由其當你還有業務邏輯混合在一起時很容易發生。

筆者曾經遇見過2個項目,出現out of memory或者是connection pool has been leakage,經查代碼就是在每個dao中多關或者在service層中漏關,或者是每個dao有自己的conntionconn=getConnection(),然后還跑到Service層里去關這個connection(那關什么,關個P關!)。

當然,如果你說你在寫法上絕對promise絕對注意這樣的問題不會發生,但是我們來看看下面的這種做法,是否會比上面這個寫法更好呢?

2.3 Spring中的做法

先來看spring中的寫法。

大家應該都很熟悉Spring中的寫法了,來看一下它是怎么解決的。

Service層

public void serviceMethod(){

try{

??? //aop 自動加入connection,并且將conn.setAutoCommit(false);

dao1.doSomething();

dao2.doSomething();

dao3.doSomething();

}catch(Exception e){

??? //aop 自動加入rollback

}finally{

??? //aop自動加入conn.setAutoCommit(true)

??? //aop 自動加入conn.close();

}

這邊我們不講AOP,因為用類反射結合xml很容易將aop 自動。。。這些東西加入我們的代碼中去是不是?我們只管寫dao方法,service方法,不需要關心在哪邊commit哪邊rollback何時connection,spring的聲明式事務會幫我們負責,這種風格我們稱為“優雅”,各層間耦合度極大程度上的降低,封裝性好。

因此,我們可以總結出下面這些好處:

2? Service層的方法只管開啟事務(如果講究點的還會設一個Transaction);

2? 在該Service層中的所有dao使用該service方法中開啟的事務(即connection);

2? Dao中每次只管getCurrentConnection(獲取當前的connection),與進行數據處理

2? Dao層中如果發生錯誤就拋回Service層

2? Service層中接到exception,在catch{}中rollback,在try{}未尾commit,在finally塊中關閉整個connection。

這。。。就是我們所說的ThreadLocal。

舉個更實際的例子再次來說明ThreadLocal:

我們有3個用戶訪問同一個service方法,該service方法內有3個dao方法為一個完整事務,那么整個web容器內只因該有3個connection,并且每個connection之間的狀態,彼此“隔離”。

我們下面一起來看我們如何用代碼實現類似于Spring的這種做法。

首先,根據我們的ThreadLocal的概念,我們先聲明一個ConnectionManager的類。

2.4?利用ThreadLocal制作ConnectionManager

public class ConnectionManager {

???????? private static ThreadLocal tl = new ThreadLocal();

???????? private static Connection conn = null;

???????? public static void BeginTrans(boolean beginTrans) throws Exception {

?????????????????? if (tl.get() == null || ((Connection) tl.get()).isClosed()) {

??????????????????????????? conn = SingletonDBConnection.getInstance().getConnection();

??????????????????????????? conn = new ConnectionSpy(conn);

??????????????????????????? if (beginTrans) {

???????????????????????????????????? conn.setAutoCommit(false);

??????????????????????????? }

??????????????????????????? tl.set(conn);

?????????????????? }

???????? }

???????? public static Connection getConnection() throws Exception {

?????????????????? return (Connection) tl.get();

???????? }

???????? public static void close() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? ((Connection) tl.get()).close();

?????????????????? tl.set(null);

???????? }

???????? public static void commit() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).commit();

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

???????? }

???????? public static void rollback() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).rollback();

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

???????? }

}

2.5?利用ThreadLocal改造Service與Dao層

Service層(注意紅色標粗-好粗yeah,的地方

package sky.org.service.impl;

public class StudentServiceImpl implements StudentService {

???????? public void addStudent(Student std) throws Exception {

???????????????????StudentDAO studentDAO = new StudentDAOImpl();

?????????????????? ClassRoomDAO classRoomDAO = new ClassRoomDAOImpl();

?????????????????? try {

??????????????????????????? ConnectionManager.BeginTrans(true);

????????????????????????????studentDAO.addStudent(std);

????????????????????????????classRoomDAO

??????????????????????????????????????????????.addStudentClassRoom(std.getClassRoomId(), std.getsNo());

????????????????????????????ConnectionManager.commit();

?????????????????? } catch (Exception e) {

????????????????????????????try {

???????????????????????????????????? ConnectionManager.rollback();

??????????????????????????? } catch (Exception de) {

??????????????????????????? }

??????????????????????????? throw new Exception(e);

?????????????????? }finally {

??????????????????????????? try {

???????????????????????????????????? ConnectionManager.close();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

}

Look,如果我把上述標粗(沒有加紅色)的地方,全部用AOP的方式從這塊代碼的外部“切”進去。。。是不是一個Spring里的Service方法就誕生了?

下面來看一個完整的例子

2.6?使用ThreadLocal分離Service、DAO層

先來看表結構:

T_Student表

T_ClassRoom表

T_Student_ClassRoom表

需求:

很簡單,T_ClassRoom表里已經有值了,在插入T_Student表的數據時同時要給這個學生分配一個班級并且插入T_Student_ClassRoom表,這就是一個事務,這兩步中有任何一步出錯,事務必須回滾。

看來工程的結構吧:

下面開始放出所有源代碼:

2.6.1 ConnectionManager類

package sky.org.util.db;

import java.sql.*;

public class ConnectionManager {

???????? private static ThreadLocal tl = new ThreadLocal();

???????? private static Connection conn = null;

???????? public static void BeginTrans(boolean beginTrans) throws Exception {

?????????????????? if (tl.get() == null || ((Connection) tl.get()).isClosed()) {

??????????????????????????? conn = DBConnection.getInstance().getConnection();

??????????????????????????? conn = new ConnectionSpy(conn);

??????????????????????????? if (beginTrans) {

???????????????????????????????????? conn.setAutoCommit(false);

??????????????????????????? }

??????????????????????????? tl.set(conn);

?????????????????? }

???????? }

???????? public static Connection getConnection() throws Exception {

????????????????? return (Connection) tl.get();

???????? }

???????? public static void close() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? ((Connection) tl.get()).close();

?????????????????? tl.set(null);

???????? }

???????? public static void commit() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).commit();

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

???????? }

???????? public static void rollback() throws SQLException {

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).rollback();

?????????????????? } catch (Exception e) {

?????????????????? }

?????????????????? try {

??????????????????????????? ((Connection) tl.get()).setAutoCommit(true);

?????????????????? } catch (Exception e) {

?????????????????? }

???????? }

}

2.6.2 DBConnection類

package sky.org.util.db;

public class DBConnection {

???????? private static DBConnection instance = null;

???????? private static String driverClassName = null;

???????? private static String connectionUrl = null;

???????? private static String userName = null;

???????? private static String password = null;

???????? private static Connection conn = null;

???????? private static Properties jdbcProp = null;

???????? private DBConnection() {

???????? }

???????? private static Properties getConfigFromPropertiesFile() throws Exception {

?????????????????? Properties prop = null;

?????????????????? prop = JdbcProperties.getPropObjFromFile();

?????????????????? return prop;

???????? }

???????? private static void initJdbcParameters(Properties prop) {

?????????????????? driverClassName = prop.getProperty(Constants.DRIVER_CLASS_NAME);

?????????????????? connectionUrl = prop.getProperty(Constants.CONNECTION_URL);

?????????????????? userName = prop.getProperty(Constants.DB_USER_NAME);

?????????????????? password = prop.getProperty(Constants.DB_USER_PASSWORD);

???????? }

???????? private static void createConnection() throws Exception {

?????????????????? Class.forName(driverClassName);

?????????????????? conn = DriverManager.getConnection(connectionUrl, userName, password);

???????? }

???????? public static Connection getConnection() throws Exception {

?????????????????? return conn;

???????? }

???????? public synchronized static DBConnection getInstance()throws Exception{

?????????????????? if (instance == null) {

??????????????????????????? jdbcProp = getConfigFromPropertiesFile();

??????????????????????????? instance = new DBConnection();

?????????????????? }

?????????????????? initJdbcParameters(jdbcProp);

?????????????????? createConnection();

?????????????????? return instance;

???????? }

}

2.6.3 JdbcProperties類

package sky.org.util.db;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.NET.URL;

import java.util.*;

public class JdbcProperties {

???????? private static Log logger = LogFactory.getLog(JdbcProperties.class);

???????? public static Properties getPropObjFromFile() {

?????????????????? Properties objProp = new Properties();

?????????????????? ClassLoader classLoader = Thread.currentThread()

???????????????????????????????????? .getContextClassLoader();

?????????????????? URL url = classLoader.getResource(Constants.JDBC_PROPERTIES_FILE);

?????????????????? if (url == null) {

??????????????????????????? classLoader = ClassLoader.getSystemClassLoader();

??????????????????????????? url = classLoader.getResource(Constants.JDBC_PROPERTIES_FILE);

?????????????????? }

?????????????????? File file = new File(url.getFile());

?????????????????? InputStream inStream = null;

?????????????????? try {

??????????????????????????? inStream = new FileInputStream(file);

??????????????????????????? objProp.load(inStream);

?????????????????? } catch (FileNotFoundException e) {

??????????????????????????? objProp = null;

??????????????????????????? e.printStackTrace();

?????????????????? } catch (IOException e) {

??????????????????????????? e.printStackTrace();

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? if (inStream != null) {

?????????????????????????????????????????????? inStream.close();

?????????????????????????????????????????????? inStream = null;

???????????????????????????????????? }

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

?????????????????? return objProp;

???????? }

}

2.6.4 Resource目錄下的jdbc.properties

jdbc.driverClassName=com.MySQL.jdbc.Driver

jdbc.databaseURL=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8

jdbc.username=mysql

jdbc.password=password_1

2.6.5 StudentService接口

package sky.org.service;

import java.util.List;

import java.util.Vector;

import sky.org.bean.*;

public interface StudentService {

???????? public void addStudent(Student std) throws Exception;

}

2.6.6 StudentServiceImpl類

package sky.org.service.impl;

import java.util.ArrayList;

import java.util.List;

import java.util.Vector;

import sky.org.util.db.ConnectionManager;

import sky.org.util.*;

import sky.org.bean.*;

import sky.org.dao.*;

import sky.org.dao.impl.*;

import sky.org.service.*;

public class StudentServiceImpl implements StudentService {

???????? public void addStudent(Student std) throws Exception {

?????????????????? StudentDAO studentDAO = new StudentDAOImpl();

?????????????????? ClassRoomDAO classRoomDAO = new ClassRoomDAOImpl();

?????????????????? try {

??????????????????????????? ConnectionManager.BeginTrans(true);

??????????????????????????? studentDAO.addStudent(std);

??????????????????????????? classRoomDAO

?????????????????????????????????????????????? .addStudentClassRoom(std.getClassRoomId(), std.getsNo());

??????????????????????????? ConnectionManager.commit();

?????????????????? } catch (Exception e) {

??????????????????????????? try {

???????????????????????????????????? ConnectionManager.rollback();

??????????????????????????? } catch (Exception de) {

??????????????????????????? }

??????????????????????????? throw new Exception(e);

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? ConnectionManager.close();

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

}

2.6.7 ClassRoomDAO接口

package sky.org.dao;

import java.util.HashMap;

import java.util.List;

public interface ClassRoomDAO {

???????? public void addStudentClassRoom(String roomId, String sNo) throws Exception;

}

2.6.8 ClassRoomDAOImpl類

package sky.org.dao.impl;

import java.sql.*;

import java.util.*;

import sky.org.dao.ClassRoomDAO;

import sky.org.util.db.ConnectionManager;

public class ClassRoomDAOImpl implements ClassRoomDAO {

???????? public void addStudentClassRoom(String roomId, String sNo) throws Exception {

?????????????????? Connection conn = null;

?????????????????? PreparedStatement pstmt = null;

?????????????????? try {

??????????????????????????? conn = ConnectionManager.getConnection();

??????????????????????????? pstmt = conn

?????????????????????????????????????????????? .prepareStatement(ClassRoomDAOSql.ADD_STUDENT_CLASSROOM);

??????????????????????????? pstmt.setString(1, roomId);

??????????????????????????? pstmt.setString(2, sNo);

??????????????????????????? pstmt.executeUpdate();

?????????????????? } catch (Exception e) {

??????????????????????????? throw new Exception("addStudentClassRoom:" + e.getMessage(), e);

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? if (pstmt != null) {

?????????????????????????????????????????????? pstmt.close();

?????????????????????????????????????????????? pstmt = null;

???????????????????????????????????? }

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

}

2.6.9 StudentDAO接口

package sky.org.dao;

import java.util.*;

import sky.org.bean.Student;

public interface StudentDAO {

???????? public void addStudent(Student std) throws Exception;

}

2.6.10 StudentDAOImpl類

package sky.org.dao.impl;

import java.sql.*;

import javax.sql.*;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import sky.org.bean.Student;

import sky.org.dao.StudentDAO;

import sky.org.util.db.ConnectionManager;

import java.util.List;

import java.util.ArrayList;

import java.util.Vector;

import java.text.*;

import sky.org.util.StringUtil;

public class StudentDAOImpl implements StudentDAO {

???????? private Log logger = LogFactory.getLog(this.getClass());

???????? public void addStudent(Student std) throws Exception {

?????????????????? Connection conn = null;

?????????????????? PreparedStatement pstmt = null;

?????????????????? try {

??????????????????????????? conn = ConnectionManager.getConnection();

??????????????????????????? pstmt = conn.prepareStatement(StudentDAOSql.ADD_STUDENT);

??????????????????????????? pstmt.setString(1, std.getsNo());

??????????????????????????? pstmt.setString(2, std.getsName());

??????????????????????????? pstmt.setString(3, std.getsAge());

??????????????????????????? pstmt.setString(4, std.getGender());

??????????????????????????? pstmt.setDate(5, StringUtil.convertStrToDate(std.getSbirth()));

??????????????????????????? pstmt.executeUpdate();

?????????????????? } catch (Exception e) {

??????????????????????????? throw new Exception("addStudent:" + e.getMessage(), e);

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? if (pstmt != null) {

?????????????????????????????????????????????? pstmt.close();

?????????????????????????????????????????????? pstmt = null;

???????????????????????????????????? }

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

???????? public void delStudent(String sNo) throws Exception {

?????????????????? Connection conn = null;

?????????????????? PreparedStatement pstmt = null;

?????????????????? try {

??????????????????????????? conn = ConnectionManager.getConnection();

??????????????????????????? pstmt = conn.prepareStatement(StudentDAOSql.DEL_STUDENT);

??????????????????????????? pstmt.setString(1, sNo);

??????????????????????????? pstmt.executeUpdate();

?????????????????? } catch (Exception e) {

??????????????????????????? throw new Exception("delStudent:" + e.getMessage(), e);

?????????????????? } finally {

??????????????????????????? try {

???????????????????????????????????? if (pstmt != null) {

?????????????????????????????????????????????? pstmt.close();

?????????????????????????????????????????????? pstmt = null;

???????????????????????????????????? }

??????????????????????????? } catch (Exception e) {

??????????????????????????? }

?????????????????? }

???????? }

}

2.6.11 StudentDAOSql類

package sky.org.dao.impl;

public class StudentDAOSql {

public final static String ADD_STUDENT = "insert into t_student(sno, sname, sage, gender,

sbirth)values(?,?,?,?,?)";

}

2.6.12 ClassRoomDAOSql類

package sky.org.dao.impl;

public class ClassRoomDAOSql {

???????? public static String ADD_STUDENT_CLASSROOM = "insert into

t_student_classroom(room_id,sno)values(?,?)";

}

2.6.13 ClassRoom?類

package sky.org.bean;

import java.io.*;

public class ClassRoom implements Serializable {

???????? private String roomId = "";

???????? private String roomName = "";

???????? public String getRoomId() {

?????????????????? return roomId;

???????? }

???????? public void setRoomId(String roomId) {

?????????????????? this.roomId = roomId;

???????? }

???????? public String getRoomName() {

?????????????????? return roomName;

???????? }

???????? public void setRoomName(String roomName) {

?????????????????? this.roomName = roomName;

???????? }

}

2.6.14 Student類

package sky.org.bean;

import java.io.*;

public class Student implements Serializable {

???????? public String getsNo() {

?????????????????? return sNo;

???????? }

???????? public void setsNo(String sNo) {

?????????????????? this.sNo = sNo;

???????? }

???????? public String getsName() {

?????????????????? return sName;

???????? }

???????? public void setsName(String sName) {

?????????????????? this.sName = sName;

???????? }

???????? public String getsAge() {

?????????????????? return sAge;

???????? }

???????? public void setsAge(String sAge) {

?????????????????? this.sAge = sAge;

???????? }

???????? public String getGender() {

?????????????????? return gender;

???????? }

???????? public void setGender(String gender) {

?????????????????? this.gender = gender;

???????? }

???????? private String sNo = "";

???????? private String sName = "";

???????? private String sAge = "";

???????? private String gender = "";

???????? private String sbirth = "";

???????? private String classRoomId = "";

???????? private String classRoomName = "";

???????? public String getClassRoomId() {

?????????????????? return classRoomId;

???????? }

???????? public void setClassRoomId(String classRoomId) {

?????????????????? this.classRoomId = classRoomId;

???????? }

???????? public String getClassRoomName() {

?????????????????? return classRoomName;

???????? }

???????? public void setClassRoomName(String classRoomName) {

?????????????????? this.classRoomName = classRoomName;

???????? }

???????? public String getSbirth() {

?????????????????? return sbirth;

???????? }

???????? public void setSbirth(String sbirth) {

?????????????????? this.sbirth = sbirth;

???????? }

}

2.6.15 StudentCRUD類(運行主類)

package sky.org.test;

import sky.org.bean.Student;

import sky.org.service.StudentService;

import sky.org.service.impl.StudentServiceImpl;

public class StudentCRUD {

???????? public void addStudent() throws Exception {

?????????????????? StudentService stdService = new StudentServiceImpl();

?????????????????? Student std = new Student();

?????????????????? std.setsNo("101");

?????????????????? std.setsName("abc");

?????????????????? std.setSbirth("1977/01/01");

?????????????????? std.setsAge("35");

?????????????????? std.setGender("m");

?????????????????? std.setClassRoomId("1");

?????????????????? std.setClassRoomName("class1");

?????????????????? stdService.addStudent(std);

???????? }

???????? public static void main(String[] args) {

?????????????????? StudentCRUD testStudentCRUD = new StudentCRUD();

?????????????????? try {

??????????????????????????? testStudentCRUD.addStudent();

?????????????????? } catch (Exception e) {

??????????????????????????? e.printStackTrace();

??????????????????????????? System.exit(-1);

?????????????????? }

???????? }

}

三、Hibernate里的ThreadLocal

hibernate在事務操作中也支持ThreadLocal的作法,我們這邊指的是不用Spring去做代理,而直接用Hibernate。即:

Service Method{

hbDAO1.doSomething();

hbDAO2.doSomething();

hbDAO3.doSomething();

。。。

}

Hibernate版本3后增加了新特性,即getCurrentSession()。

3.1 getCurrentSession與openSession的區別

3.1.1 openSession

我們傳統的做法是openSession即:

public void testUser() throws Exception {

?????????????????? Transaction tran = null;

?????????????????? SessionFactory factory = null;

?????????????????? UserDAO userDAO = new UserDAOImpl();

?????????????????? try {

??????????????????????????? factory = HibernateUtil.getInstance().getSessionFactory();

??????????????????????????? Session session = factory.openSession();

??????????????????????????? tran = session.beginTransaction();

??????????????????????????? TUser testUser = new TUser();

??????????????????????? testUser.setId(new Integer(i));

??????????????????????????? testUser.setName("abc");

??????????????????????????? userDAO.addUser(testUser);

??????????????????????????? tran.commit();

?????????????????? } catch (Exception e) {

??????????????????????????? tran.rollback();

??????????????????????????? throw new Exception(e);

?????????????????? } finally {

??????????????????????????? try{

??? if(session!=null){

??? session.close();

??? session=null();

}

}catch(Excepton e){}

?????????????????? }

???????? }

這樣做,能夠保證我們每次在finally塊中正確關閉session,但是,如果我們也遇上了這樣的case即:

Service Method{

hbDAO1.doSomething();

hbDAO2.doSomething();

hbDAO3.doSomething();

。。。

}

這時,我們如果用的是openSession,應該怎么辦?

解決方案一:

自己用ThreadLocal模式寫一個SessionManagement類,來維護這個session。

解決方案二:

把在Service方法中打開的session,傳到每個dao方法中,使每個dao方法使用同一個session,最后在Service方法中去關閉它(很爛的做法)。

下面我們來看看Hibernate自身提供的getCurrentSession()的做法吧

3.1.2 getCurrentSession

要使用這個getCurrentSession,你的hibernate的設置必須如下(紅色加粗部分顯示-就喜歡粗J):

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

????????? "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

????????? "http://hibernate.sourceforge.Net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

???????? <session-factory>

?????????????????? <property name="connection.url">

??????????????????????????? jdbc:Oracle:thin:@localhost:1521:myorcl

?????????????????? </property>

?????????????????? <property name="dialect">

??????????????????????????? org.hibernate.dialect.Oracle9Dialect

?????????????????? </property>

?????????????????? <property name="connection.username">abc</property>

?????????????????? <property name="connection.password">abc</property>

?????????????????? <property name="connection.driver_class">

??????????????????????????? oracle.jdbc.OracleDriver

?????????????????? </property>

?????????????????? <property name="show_sql">true</property>

?????????????????? <property name="hibernate.hbm2ddl.auto">update</property>

???????????????????<property name="hibernate.current_session_context_class">thread</property>

?????????????????? <mapping resource="com/cts/testhb/model/TUser.hbm.xml" />

???????? </session-factory>

</hibernate-configuration>

然后上述代碼將變成如下的樣子:

public void testUser() throws Exception {

?????????????????? Transaction tran = null;

?????????????????? SessionFactory factory = null;

?????????????????? UserDAO userDAO = new UserDAOImpl();

?????????????????? try {

??????????????????????????? factory = HibernateUtil.getInstance().getSessionFactory();

????????????????????????????Session session = factory.getCurrentSession();

??????????????????????????? tran = session.beginTransaction();

??????????????????????????? for (int i = 0; i < 100; i++) {

???????????????????????????????????? TUser testUser = new TUser();

???????????????????????????????????? testUser.setId(new Integer(i));

???????????????????????????????????? testUser.setName("abc");

???????????????????????????????????? userDAO.addUser(testUser);

??????????????????????????? }

??????????????????????????? tran.commit();

?????????????????? } catch (Exception e) {

??????????????????????????? tran.rollback();

??????????????????????????? throw new Exception(e);

?????????????????? } finally {

????????????????????????????ThreadLocalSessionContext.unbind(factory);

?????????????????? }

???????? }

而你的每個DAO方法中的代碼是這樣實現的:

public void addUser(TUser user) throws Exception {

???????? SessionFactory factory = HibernateUtil.getInstance()

??????????????????????????? .getSessionFactory();

???????? Session session = factory.getCurrentSession();

???????? session.save(user);

}

是不是很方便的哈。

3.1.3 openSession與getCurrentSession的區別

嚴重注意下面3點:

2? openSession一旦被調用,必須且一定要在finally塊中close,要不然你就等著out of memory吧;

2? 如果你使用的是getCurrentSession,那么你不能在finally塊中調用”session.close()”,不行你可以在finally塊中用try-catch把session.close();包起來,然后在catch{}塊中拋出這個exception,這個exception將會是:sessionhas been already closed。

因為:

l?? 如果你用的是getCurrentSession,那么它在session.commit()或者是session.rollback()時就已經調用了一次session.close()了,因此你只要正確放置session.commit()與rollback()即可。

l?? 你必須在finally塊中調用”ThreadLocalSessionContext.unbind(factory);”,以使得當前的事務結束時把session(即dbconnection)還回db connection pool中

2? 如果你使用的是getCurrentSession,那么就算你是一個簡單的select語句,也必須包含在:

tran = session.beginTransaction();

//your select hibernate query

tran.commit();

這樣的事務塊中,要不然它將會拋出這樣的一個錯誤:

NoHibernate Session bound to thread, and configuration does not allow creation ofnon-transactional

看下面的例子:

try {

??????????????????? factory = HibernateUtil.getInstance().getSessionFactory();

??????????????????? Session session = factory.getCurrentSession();

????????????????????tran = session.beginTransaction();

??????????????????? TUser testUser = userDAO.getUserByID("1");

??????????????????? log.info("user id===="+testUser.getId()+"? user name===="+testUser.getName());

????????????????????tran.commit();

?????????? } catch (Exception e) {

????????????????????tran.rollback();

??????????????????? throw new Exception(e);

?????????? } finally {

??????????????????? ThreadLocalSessionContext.unbind(factory);

?????????????????? }

可以看到我們的查詢是被tran=session.beginTransaction一直到tran.commit()或者是tran.rollback()結束的,如果,你把你的hibernate查詢移到了tran=session.beginTransaction的上面。。。就會拋上述這個錯誤。

3.1.4 getCurrentSession帶來的問題

getCurrentSession非常好,不需要我們自己寫ThreadLocal只需要在hibernate.cfg的配置文件中聲音一下就可以獲得ThreadLocal的好處,便于我們劃分我們的程序的層次與封裝,帶也帶來了一定的性能問題。

特別是“如果你使用的是getCurrentSession,那么就算你是一個簡單的select語句,也必須包含在事務塊中”。這給我們帶來了很大的問題。

因此,本人建議,在碰到如果:

1.?????? 一個service方法中只有單個dao操作且此操作是一個select類的操作,請使用openSession,并且即時在finally塊中關閉它;

2.?????? 如果一個service方法中涉及到多個dao操作,請一定使用getCurrentSession;

3.?????? 如果一個service方法中混合著select操作,delete, update, insert操作。請按照下述原則:

1)????? 將屬于select的操作,單獨做成一個dao方法,該dao使用openSession并且在finally塊中及時關閉session,該dao只需要返回一個java的object如:List<Student>即可,如果出錯將exception拋回給調用它的service方法。

2)????? 對于其它的delete, insert, update的dao操作,請使用getCurrentSession。

4.?????? 忌諱,把select類的操作放在“事務”中;

總結

以上是生活随笔為你收集整理的通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

九九热视频在线播放 | 久久久国产精品麻豆 | 亚洲成人av电影在线 | 国产伦理久久精品久久久久_ | 免费黄色激情视频 | 亚洲精品www久久久久久 | 亚洲成a人片77777kkkk1在线观看 | 手机av观看 | 午夜精品视频在线 | 婷婷丁香在线观看 | 亚洲第一色 | 色伊人网 | 国产91精品看黄网站在线观看动漫 | 四虎永久免费网站 | 精品国偷自产国产一区 | 伊香蕉大综综综合久久啪 | 久久公开免费视频 | 亚洲国产精品电影在线观看 | 人人澡人人草 | 曰本三级在线 | 国产高清免费视频 | 国内久久久久 | 探花视频免费观看 | 久久官网 | 欧美日韩在线播放一区 | 国产一区二区在线免费播放 | 国产精品久久久久久久久久久久冷 | 国产精品久久久久亚洲影视 | 久久精品直播 | 国产黄色片一级三级 | 天天干夜夜夜操天 | 久久久www成人免费毛片麻豆 | 精品亚洲视频在线 | 99精品视频精品精品视频 | 热久久影视 | 婷婷伊人网 | 干干操操 | 91亚色视频| 国产精品久久久久久久久久免费看 | 久久久夜色 | 大荫蒂欧美视频另类xxxx | 日韩国产精品毛片 | 在线观看免费色 | 国产aaa毛片 | 五月天堂网 | av夜夜操 | 免费电影一区二区三区 | 欧美日韩精品影院 | 黄色网址中文字幕 | 丁香激情五月 | 久久久久久久久久久黄色 | 国产99一区 | 日本精品免费看 | 国产特级毛片aaaaaa毛片 | 黄色福利 | 欧美日韩精品在线观看视频 | 9色在线视频 | 成人一区电影 | 国产精品久久久久婷婷 | 91高清免费看 | 夜夜干天天操 | 狠狠干天天色 | 天天操夜夜干 | 色综合夜色一区 | 久久久96 | 2019国产精品 | 久久久综合九色合综国产精品 | 成年人免费观看国产 | 97手机电影网 | 免费国产黄线在线观看视频 | 国产又粗又长的视频 | 人人射人人澡 | 五月天亚洲综合 | 国产精品永久在线观看 | 中文视频在线看 | 午夜在线日韩 | 免费看一级黄色大全 | 国产在线不卡精品 | 久草爱 | 粉嫩av一区二区三区免费 | 精品色999 | 国产.精品.日韩.另类.中文.在线.播放 | 国产精品国产亚洲精品看不卡 | 欧美在线视频不卡 | 九色porny真实丨国产18 | 狠狠干,狠狠操 | 欧美极品一区二区三区 | 天堂在线视频免费观看 | 色天天天 | 黄色片毛片 | .国产精品成人自产拍在线观看6 | 精品一二三区 | 国产精品中文字幕在线观看 | 在线日韩中文字幕 | av福利在线导航 | 色婷婷视频在线 | 久久精品99久久 | 九九欧美视频 | 狠狠干狠狠久久 | 久久精品伊人 | 欧美精品在线视频 | 综合黄色网 | 久草国产在线观看 | 久草国产在线观看 | 久热av在线| 狠狠干夜夜爱 | 久久99精品国产麻豆宅宅 | 成人91免费视频 | 欧洲一区精品 | 久久久久久久久久免费视频 | 一区二区三区日韩在线观看 | 在线国产日韩 | 综合精品久久久 | 欧美一级久久久 | 国产一区在线观看视频 | 久久艹艹 | 在线观看亚洲国产 | 久久精品高清视频 | 国产亚洲视频在线免费观看 | 久久99久久99精品免费看小说 | 九九影视理伦片 | 亚洲一区二区精品视频 | a在线v| 日日夜夜网| 四虎永久国产精品 | 免费中午字幕无吗 | www.久久爱.cn | 91视频a| 国产精品电影一区 | 亚洲精品电影在线 | 亚洲精品小视频在线观看 | 最近日本mv字幕免费观看 | 九九免费视频 | 久久精品视频国产 | 香蕉久草在线 | 国产在线a免费观看 | 91热视频| 欧美日韩在线免费观看 | 69国产精品视频 | 国产不卡一二三区 | 国产在线色视频 | 国内精品国产三级国产aⅴ久 | 一区二区三区四区在线免费观看 | 超碰97免费在线 | 国产专区精品 | 国产精品18久久久久久久久 | 亚洲天天干 | 久久久综合精品 | 中文字幕在线视频一区 | 很黄很污的视频网站 | 免费在线视频一区二区 | 成年人三级网站 | 九色porny真实丨国产18 | 人人超碰人人 | 永久中文字幕 | 在线观看理论 | 久久免费美女视频 | 色香蕉网 | 精品999在线观看 | 亚洲性少妇性猛交wwww乱大交 | 亚洲,播放| 亚洲精品国产拍在线 | 日韩成人精品一区二区三区 | 色福利网站| 97碰视频| 91视频这里只有精品 | 玖玖999 | 91av精品 | 天堂av在线免费 | 草久在线 | 九色免费视频 | 日韩一区二区三区视频在线 | 91麻豆传媒| 高清日韩一区二区 | 去干成人网 | 麻豆国产精品永久免费视频 | 国产在线精品视频 | 日韩网站在线看片你懂的 | 98超碰在线 | 香蕉手机在线 | 人人澡视频 | 久黄色| 日韩激情第一页 | 国产香蕉视频 | 最新色视频| 97精品国产91久久久久久久 | 久久成电影 | 在线成人免费av | 欧美极品xxx | 天操夜夜操 | 国产尤物在线观看 | 国产一区二区三区免费观看视频 | 国产欧美在线一区 | 91丨九色丨蝌蚪丨对白 | 午夜在线日韩 | 久草在线免费新视频 | 成年免费在线视频 | 午夜国产福利在线 | 午夜视频免费播放 | 成人中文字幕在线 | 久久精品一级片 | 久久99久久精品国产 | 高清av免费观看 | 91在线网址 | 亚洲国产网站 | 国产成人亚洲精品自产在线 | 日本精品视频免费观看 | 日韩精品三区四区 | 久草视频在线免费播放 | 在线观看视频在线观看 | 免费成人短视频 | 欧美日韩在线观看一区二区三区 | 亚州人成在线播放 | 亚洲日b视频 | 国产在线a视频 | 国产精品99久久久精品免费观看 | 日本99精品 | 久久黄色小说视频 | 久久精品综合网 | 日日操日日插 | 手机av电影在线观看 | 国产一区在线免费观看视频 | 五月天色网站 | 国产精品乱码高清在线看 | 99精品一级欧美片免费播放 | 国产精成人品免费观看 | 国产成人免费精品 | 亚洲少妇xxxx | 国产福利a| 日韩高清一区在线 | av成人在线观看 | 午夜在线国产 | 你操综合 | 99re热精品视频 | 日本中文在线 | www.天天射| 97免费在线观看视频 | 免费三级黄色片 | 99热9 | 国产理伦在线 | 国产午夜精品久久 | 久久 地址 | 国产一级在线 | 国产精品久久久一区二区三区网站 | 九九久久久久久久久激情 | 玖玖精品视频 | 99精品在线视频观看 | 麻豆视屏 | 亚洲精品福利在线 | 久热爱| 日本大片免费观看在线 | 黄av资源 | 国产美女精品在线 | 天天躁日日躁狠狠躁av麻豆 | 国产69精品久久久久99尤 | 天堂av在线免费观看 | 国产精品精品国产色婷婷 | 国产精品一区二区免费在线观看 | 少妇搡bbbb搡bbb搡忠贞 | 激情网婷婷 | 久久久在线 | 美女视频久久久 | 成人一级片视频 | 久久国产剧场电影 | 免费在线国产黄色 | 激情开心站 | 久久国产精品99久久久久 | jizz999 | 日韩免费高清在线观看 | 亚洲精品视频网站在线观看 | 国产精选在线 | av不卡免费看 | 国产亚洲婷婷免费 | 色视频网站免费观看 | 国产精品密入口果冻 | 西西www4444大胆视频 | 美女久久久久久 | 国产小视频91 | 在线免费观看视频一区二区三区 | 亚洲v精品 | 日本精品久久久久久 | 成人av影视在线 | 免费日韩视 | 欧美色插| 五月婷婷一级片 | 免费视频91| 黄色免费看片网站 | 亚洲一区二区视频 | 亚洲一区视频在线播放 | 久久中文精品视频 | 国产精品国产三级国产不产一地 | 最新av在线网址 | 中文字幕 国产视频 | 九热在线| 国内精品久久久久久久97牛牛 | 欧美另类交在线观看 | 日韩电影一区二区在线观看 | 91av欧美| 久久精品国产亚洲精品2020 | 激情av网址 | 成人av午夜 | 日日干综合| 91精品爽啪蜜夜国产在线播放 | 免费日韩 精品中文字幕视频在线 | 婷婷色综 | 国产一二三精品 | 久久视频在线 | av免费福利| 欧美少妇xx| 欧美亚洲国产日韩 | 久久综合婷婷国产二区高清 | 国产一级高清 | 日韩乱码在线 | 毛片网免费 | av无限看 | 美女久久久久久久久久 | 99成人免费视频 | 麻花豆传媒mv在线观看网站 | 欧美日韩不卡在线 | 天天干视频在线 | 91精品老司机久久一区啪 | 99久久er热在这里只有精品15 | 国产成人免费观看 | 在线观看国产亚洲 | 久久久久人人 | 日韩精品一区二区电影 | av中文字幕免费在线观看 | 黄色网www | 久久久网址 | 丝袜+亚洲+另类+欧美+变态 | 成人三级视频 | 国内精品视频在线 | 一区二区三区高清在线观看 | 免费av大全 | 久久色中文字幕 | 丁香六月天 | av网站免费线看精品 | 亚洲综合激情小说 | 国产精品视频在线看 | 在线天堂中文在线资源网 | 国产精品美女www爽爽爽视频 | 99热这里只有精品免费 | 日本久久久久久 | 日韩欧美精品一区二区 | 国产不卡高清 | 久久精品欧美日韩精品 | 超碰国产在线观看 | 婷婷亚洲综合五月天小说 | 国产黄影院色大全免费 | 成人久久精品视频 | 亚州欧美精品 | 国产无遮挡又黄又爽馒头漫画 | 精品视频 | 精品色综合| 天天爽天天搞 | 国产精品视频久久久 | 伊人五月天 | 欧美日韩免费在线观看视频 | 中文字幕中文字幕在线中文字幕三区 | 国产二区免费视频 | 欧美精品一区二区在线观看 | 日本精品在线 | 久久久久久蜜桃一区二区 | 69精品| 国产又粗又猛又黄又爽 | 免费亚洲黄色 | 91亚洲精品久久久蜜桃网站 | 波多野结衣电影一区二区 | 天天操天天射天天舔 | 国产特黄色片 | h动漫中文字幕 | 丁香资源影视免费观看 | 99爱精品在线 | 久久不射电影院 | 亚洲国产精品免费 | 成人羞羞视频在线观看免费 | 成人资源站 | 亚洲第一久久久 | 久久久久亚洲国产精品 | 亚洲一二三在线 | 国产亚洲精品女人久久久久久 | 国产在线更新 | 日韩理论片中文字幕 | h视频日本 | 99久久99热这里只有精品 | 久久国产精品久久久久 | 99久久99 | 97视频免费观看 | 91在线文字幕 | 国产午夜亚洲精品 | 国产麻豆精品一区二区 | sm免费xx网站| 黄色大片免费网站 | 国产成人a v电影 | 99久久夜色精品国产亚洲 | 久久刺激视频 | 在线看黄网站 | 日本三级香港三级人妇99 | 亚洲激情综合网 | 日韩精品在线免费播放 | 国产在线高清 | 国产福利不卡视频 | 激情婷婷六月 | 久久99久久99精品免视看婷婷 | 91在线文字幕| 特级西西人体444是什么意思 | 成人黄色小视频 | 天天干天天做 | 久久久久电影 | 日韩精品91偷拍在线观看 | 成人免费视频免费观看 | a在线播放 | 国产精品国内免费一区二区三区 | 麻豆传媒视频在线免费观看 | 久久久噜噜噜久久久 | 91av在线不卡| 亚洲视频 在线观看 | 国产精品1区2区在线观看 | av无限看| 久久久受www免费人成 | 91香蕉久久 | 久久九九精品 | 日韩美女免费线视频 | 国产一区二区三区在线 | 亚洲一区二区三区在线看 | 久久国产精品久久国产精品 | 国产流白浆高潮在线观看 | 在线观看国产www | 99久久精品国产一区二区三区 | 亚洲国产精品成人va在线观看 | 欧美日韩久久久 | 欧美日韩一区二区在线观看 | 久久成人一区 | 天天操天天操一操 | 国产黄色片久久久 | 在线看不卡av | 亚洲精品影视在线观看 | 精品在线你懂的 | 午夜精品久久久久久久99 | 午夜久久影视 | 日本精品视频一区二区 | 视频成人| 综合久久久久 | 射久久久| 国产精品久久久久毛片大屁完整版 | 国产视频999 | 91视频免费看片 | 在线观看91精品视频 | 天天操天天干天天插 | 中文字幕一区二区三区四区视频 | 国产在线国偷精品产拍免费yy | 日韩三级视频在线观看 | 亚洲精品777 | 91麻豆精品91久久久久同性 | 三级小视频在线观看 | 久久精品视频观看 | 精品国产理论 | 久草综合视频 | 91精选在线 | 国语精品免费视频 | 91麻豆国产福利在线观看 | 国产在线v| 2021国产精品| 成人av免费电影 | 综合婷婷丁香 | 91看片淫黄大片在线播放 | 伊人狠狠色 | 日本精品中文字幕在线观看 | 成人av网页 | 99视频在线精品免费观看2 | 亚洲影视九九影院在线观看 | 日韩久久久久久久久久久久 | 一区二区三区精品在线视频 | 久久综合色影院 | 色婷婷在线播放 | 综合在线观看色 | av天天在线观看 | 亚洲综合小说电影qvod | 免费看黄色小说的网站 | 精品国产1区二区 | 婷婷激情综合五月天 | 亚洲欧洲国产精品 | 在线播放一区 | 亚洲国产精品资源 | 中文字幕韩在线第一页 | 久久成人国产精品一区二区 | 午夜精品一区二区三区在线视频 | 亚洲精品网址在线观看 | 麻豆影视网站 | 九色视频自拍 | 国产精选在线观看 | 三级黄色免费片 | 麻豆视频免费版 | 国产裸体永久免费视频网站 | 日韩特黄一级欧美毛片特黄 | 亚洲成人资源 | 日韩系列在线观看 | 久久久av免费 | a午夜在线 | 成人黄色资源 | 91麻豆精品91久久久久同性 | 超薄丝袜一二三区 | 亚洲美女精品区人人人人 | 国产精品麻豆免费版 | 四虎影院在线观看av | 六月丁香婷婷在线 | 一区二区三区四区五区在线视频 | 五月天婷婷视频 | 深爱激情久久 | 热久久免费视频 | 黄色av一区二区三区 | 国产成人一区二区三区久久精品 | 国产伦理久久 | 国产高清中文字幕 | 精品国产乱码久久久久久浪潮 | 欧洲精品视频一区二区 | 69视频永久免费观看 | 青春草免费在线视频 | 亚洲日本一区二区在线 | 精品久久一级片 | 在线久热 | 96av在线视频 | 久久久免费精品国产一区二区 | 国产精品成人国产乱 | 中文字幕视频网 | 久草手机视频 | 最新久久免费视频 | www婷婷| 九九交易行官网 | 日韩一区二区免费在线观看 | 在线观看国产高清视频 | 在线观看免费av网 | 久久精品欧美一区 | 国产午夜精品视频 | www天天干| 97精品国产97久久久久久粉红 | 又黄又刺激的视频 | 成人四虎影院 | av福利电影| 成片免费观看视频999 | 国产高清视频在线观看 | 91av片 | 国产永久免费高清在线观看视频 | 97视频免费观看 | 特级毛片aaa | 91在线www| 天天天综合 | 狠狠色丁香婷婷综合久久片 | 狠狠干狠狠久久 | 波多野结衣最新 | 欧美成人精品欧美一级乱黄 | 国产精品美女久久久久久久久 | 久久99精品国产99久久 | 欧美另类性 | 91亚洲精品乱码久久久久久蜜桃 | 久久久久高清毛片一级 | 中文字幕在线观看视频一区 | 成人在线播放av | 色99之美女主播在线视频 | 国产精品久久久久久久久久新婚 | 日本精品中文字幕在线观看 | 99在线免费视频观看 | 精品国产视频在线观看 | 国产精品第二页 | 国产手机视频 | 四虎国产精品永久在线国在线 | 高清一区二区 | 三级在线国产 | 国产一级片久久 | 四虎国产精品成人免费影视 | 日韩综合精品 | 欧美一区二区三区在线 | 天天操天天爽天天干 | 成人欧美一区二区三区黑人麻豆 | 欧美日韩99| 在线视频免费观看 | 国产精品久久久久久久毛片 | 久久九九久久 | 色婷婷 亚洲 | 96久久欧美麻豆网站 | 91资源在线观看 | 欧美老女人xx | 国产精品99久久久久人中文网介绍 | 免费日韩在线 | 色婷av| 国产精品ssss在线亚洲 | 草久电影| 99久久精品久久久久久清纯 | 色婷婷电影 | 91精品在线视频观看 | 国产精品视频app | 国产色在线视频 | 久久久久久久久久免费视频 | 黄色三级免费片 | av日韩国产 | 日本精品视频一区 | 99精品在线视频观看 | 久久99热这里只有精品国产 | 精品伦理一区二区三区 | 日韩免费在线看 | 24小时日本在线www免费的 | 亚洲五月综合 | 国产小视频在线播放 | 成人在线视频免费看 | 久久在线免费观看视频 | 九九热.com| 在线国产一区二区三区 | 伊人一级 | 国产v亚洲v | 中国精品一区二区 | 五月婷婷视频在线 | 亚洲精品视频在线 | 欧美激情精品久久 | 日韩国产高清在线 | 日韩精品欧美视频 | 激情网五月婷婷 | 久草视频免费播放 | 狠狠操狠狠干2017 | 四虎影视4hu4虎成人 | 国产精品永久久久久久久www | 四虎www | 国产高清精 | 色天堂在线视频 | 久久国产精品免费视频 | 久久久国产精品亚洲一区 | 国产无套一区二区三区久久 | 伊色综合久久之综合久久 | 五月天综合网站 | 中文字幕 成人 | 五月婷婷视频在线观看 | 丁香激情五月婷婷 | 99精品视频在线免费观看 | 欧美a级在线播放 | 黄网站a | 国产精成人品免费观看 | 亚洲国产欧美在线人成大黄瓜 | 久久首页 | 久久免费99精品久久久久久 | 精品av网站 | 国产精品白浆视频 | 91精品一区二区三区蜜桃 | av色网站 | 久久久视频在线 | 免费电影播放 | 婷婷色在线视频 | 日本不卡视频 | 日韩激情久久 | 国产精品一区在线观看 | 免费日韩在线 | 欧美日韩免费网站 | 日韩精品久久中文字幕 | 日韩欧美69 | 在线成人一区 | 国产伦精品一区二区三区… | 欧美亚洲成人免费 | www天天干| 狠狠躁夜夜av | 韩日电影在线观看 | 亚洲欧洲视频 | 激情在线网址 | 国产精品综合在线 | 干av在线 | 欧美电影黄色 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久蜜桃av | 久久久免费观看视频 | 国产在线va | 亚洲视频99 | 国产精品免费视频一区二区 | 欧美激情另类文学 | 99精品免费久久久久久日本 | 久久五月婷婷丁香社区 | 99久久毛片 | 狠狠躁日日躁狂躁夜夜躁 | 人人超碰人人 | 超碰人人草 | 欧美一区二区三区在线看 | 国产精品久久久久久久免费 | 色搞搞 | 亚洲午夜激情网 | 日韩欧美在线免费观看 | 视色网站 | 国产精品一区二区 91 | 国产xxxxx在线观看 | 日韩.com | av免费线看 | 天天鲁一鲁摸一摸爽一爽 | 狠狠色丁香婷婷综合久久片 | 激情综合国产 | 国产一级电影在线 | 色网站免费在线观看 | 91完整版在线观看 | 国产精品自在欧美一区 | 国产剧情av在线播放 | 狠狠色丁香婷婷 | 欧美在线视频一区二区 | 91精品国产福利在线观看 | 怡红院av | 国产高清永久免费 | 日日爱av | 欧美成a人片在线观看久 | 久久精品国产免费观看 | www.狠狠 | 人人爽人人插 | 99免费在线视频 | 久久精品免费看 | 国产精品亚洲成人 | 成人影视免费 | 午夜精品99久久免费 | 免费看短| 狠狠色综合网站久久久久久久 | 超碰免费公开 | 首页国产精品 | 成人欧美一区二区三区在线观看 | 7777精品伊人久久久大香线蕉 | 在线观看黄色的网站 | 毛片在线播放网址 | 97免费 | 91麻豆精品国产91久久久无限制版 | 亚洲精品在线观看不卡 | 日韩一区二区三区免费电影 | 黄a网| 国产精品24小时在线观看 | 中文字幕色在线 | 日韩免费网站 | 久久久久观看 | 中文在线字幕免费观 | 四虎国产精品成人免费影视 | 国产专区欧美专区 | 韩日av一区二区 | 免费看在线看www777 | av大片免费在线观看 | 日韩一片| 操高跟美女 | 三级av在线 | 色偷偷男人的天堂av | 日韩有码第一页 | 久久网站最新地址 | 国内精品视频在线 | 2018亚洲男人天堂 | 精品久久久久国产 | 婷婷综合久久 | 激情伊人五月天久久综合 | 国产日韩精品一区二区三区 | 亚洲精品久久久久中文字幕二区 | 国产美女主播精品一区二区三区 | 五月婷婷丁香六月 | 亚洲成人精品久久久 | 国产乱码精品一区二区蜜臀 | 国产一级淫片免费看 | 欧美成亚洲 | 日韩精品视 | 久久中文字幕视频 | 中文字幕国产一区二区 | 精品一区二区在线免费观看 | av在线免费播放网站 | 欧美射射射 | 女人18毛片90分钟 | 亚州国产视频 | 99久久婷婷国产精品综合 | 日日夜夜综合网 | 免费特级黄色片 | 国产又粗又硬又长又爽的视频 | 亚洲人成影院在线 | 九九精品在线观看 | av九九九| 91在线视频观看免费 | 国产短视频在线播放 | 91香蕉视频黄| 久久视频这里只有精品 | 亚洲综合欧美精品电影 | 欧美成人在线免费 | 97操碰| 国产一级在线免费观看 | 色婷婷av一区二 | 亚洲亚洲精品在线观看 | 亚洲一级二级 | av网址aaa | 午夜精品视频福利 | 久草视频在线观 | 欧美另类美少妇69xxxx | av片子在线观看 | 国产韩国日本高清视频 | 精品欧美在线视频 | av亚洲产国偷v产偷v自拍小说 | 9色在线视频 | 国产黄色片免费看 | 91在线视频免费观看 | 丁香六月婷婷激情 | 国产亚洲一级高清 | 91九色国产蝌蚪 | av网址在线播放 | 午夜av不卡 | 欧美一区二区免费在线观看 | 亚洲电影久久久 | 92中文资源在线 | 国产丝袜美腿在线 | 欧美另类高潮 | 日韩欧美极品 | 欧美高清成人 | 国产资源网站 | 久久久久网站 | 国产精品aⅴ | 国产 日韩 在线 亚洲 字幕 中文 | 国产美女视频一区 | 国产手机在线观看视频 | 亚洲一区二区精品在线 | 亚洲永久精品在线 | 91九色最新地址 | 91精品91| 在线视频国产区 | 成人午夜久久 | 亚洲欧美综合精品久久成人 | 九九精品视频在线看 | 亚洲九九爱 | 国产精品一区二区av麻豆 | 欧美日韩亚洲在线观看 | 视频国产 | 深夜免费福利视频 | 久久久久久久福利 | 久久99在线观看 | 日本系列中文字幕 | 在线观看视频色 | 免费男女羞羞的视频网站中文字幕 | 国产精品黑丝在线观看 | 欧美日韩在线观看一区二区三区 | 天天躁日日躁狠狠躁av麻豆 | 成年人视频在线免费观看 | 青草草在线 | 网站在线观看你们懂的 | 日韩精品在线看 | 天天操天天色综合 | 久草com | 91成人短视频在线观看 | 亚洲专区在线播放 | 亚洲午夜久久久综合37日本 | 国产精品视频免费在线观看 | 亚洲视频在线观看网站 | 国产裸体无遮挡 | 人人爱人人做人人爽 | 九九视频精品免费 | 黄色a级片在线观看 | 日韩高清在线不卡 | 在线免费观看的av网站 | 波多野结衣在线观看一区二区三区 | 久久九九九九 | www免费看 | 香蕉在线播放 | 天天搞天天干 | 奇米四色影狠狠爱7777 | 一区二区影视 | 91精品亚洲影视在线观看 | 中文字幕第一页在线播放 | 人人插人人插 | 国产精品毛片一区二区在线看 | 亚洲久草网 | 天天在线操 | 麻豆果冻剧传媒在线播放 | 99免费在线视频 | 国产精品一区二 | 中文字幕在线看视频国产 | 亚州精品在线视频 | 一区二区三区在线观看免费视频 | 欧美日韩18 | 尤物一区二区三区 | 在线播放第一页 | 99精品网站 | 91精品国产一区二区三区 | 成人一区影院 | 在线免费观看黄网站 | 四虎影视精品永久在线观看 | 丝袜少妇在线 | 中文在线www | 精品国内 | 五月婷综合网 | 美女视频网 | 国产精品麻豆99久久久久久 | 久99久精品视频免费观看 | 欧美成年人在线观看 | www久久 | 国产黄色片免费在线观看 | 狠狠狠狠狠狠天天爱 | 婷婷精品国产一区二区三区日韩 | 国产伦理精品一区二区 | 五月天中文字幕mv在线 | 国产黄色片在线免费观看 | 日本一区二区三区免费观看 | 激情综合网在线观看 | 91精品国产综合久久福利 | 中文字幕在线视频第一页 | 国产成人精品午夜在线播放 | 久久久久久久久久久久电影 | 超碰999| 九九色网 | 韩国一区二区三区视频 | 一区 二区电影免费在线观看 | 欧美天堂视频在线 | 欧美日韩1区| 狠狠狠色丁香婷婷综合久久88 | 国精产品永久999 | 亚洲国产精品传媒在线观看 | 激情婷婷亚洲 | 二区三区中文字幕 | 91精品视频一区 | 中文字幕亚洲精品日韩 | 国产黄在线免费观看 | 成人羞羞视频在线观看免费 | 久久人人爽人人人人片 | 天天干,天天射,天天操,天天摸 | 一级片色播影院 | 亚洲精品在线观看中文字幕 | 91精品一区二区三区久久久久久 | 国产粉嫩在线观看 | 亚洲色图 校园春色 | 久久国产一区二区 | 永久免费的av电影 | 久久久午夜精品理论片中文字幕 | 女人魂免费观看 | 久草视频在 | 精品国产一区二区在线 | 国产精品久久久久久久久久久久午夜片 | 欧美精品在线观看一区 | 99久久精品国产欧美主题曲 | 精品国产乱码久久久久久天美 | 亚洲精品国偷拍自产在线观看 | 欧美日韩国产精品一区 | av解说在线观看 | 在线电影中文字幕 | 国产91粉嫩白浆在线观看 | 久久免费的精品国产v∧ | 欧美精品一级视频 | 国产视频精选在线 | 国产做爰视频 | 日韩伦理片hd| 亚洲动漫在线观看 | 久久免费视频6 | www.久久com| 亚洲精品国产日韩 | 久久99免费观看 | 亚洲狠狠干 | 国产又粗又长又硬免费视频 | 精品久久久久国产免费第一页 | 久久这里只有精品1 | 久久综合狠狠综合久久综合88 | 日韩精品一区二区三区三炮视频 | 久久久九九 | 久久伊人综合 | 欧美日韩免费一区二区三区 | av不卡网站 | 国产成人久久av免费高清密臂 | 免费黄a| 国内综合精品午夜久久资源 | 99视频在线精品免费观看2 | 九色视频网站 | 亚洲黄色片一级 | 夜夜干天天操 | av资源网在线播放 | 三级黄色网址 | 夜夜操狠狠干 | 很黄很黄的网站免费的 | 国产尤物视频在线 | 高潮毛片无遮挡高清免费 | 天天天操操操 | 久久字幕网 | 国产资源在线播放 | 美女在线免费视频 | 国产青青青 | 中文字幕在线观看国产 | av在线影视 | 久久综合9988久久爱 | 中日韩欧美精彩视频 | 欧美性大战 | 中日韩在线视频 | 亚洲国产精品电影 | 美女在线黄 | 天天操综| 亚洲免费资源 | 精品国产一区二区三区久久久久久 | 字幕网资源站中文字幕 | a黄在线观看 | 丁香激情综合国产 | 欧美精品一区二区免费 | 成人免费在线观看入口 | 美女视频a美女大全免费下载蜜臀 | 91久久丝袜国产露脸动漫 | av日韩在线网站 | 国产亚洲一区二区在线观看 | 国产视频二区三区 | 婷婷五天天在线视频 | 麻豆国产露脸在线观看 | 美女久久久久久久 | 日日爱视频| 亚洲精品中文在线资源 | adn—256中文在线观看 | 国产精品久久久久影院日本 | 成人午夜电影久久影院 | 亚洲精品999 | 午夜视频不卡 |