java servlet threadlocal_Java--servlet + ThreadLocal解决多线程并发问题及实例

思维导图 – Servlet+ThreadLocal分包管理实例

一:本文思维导图

c25d6f2785e53ac9a7b038048ab70486.png

二:ThreadLocal原理图

e59295aacc2ccfc91cd35861a6da9188.png

三:代码:

实体层entity Book.java

package entity;

public class Book {

/*私有属性*/

private int id;

private String name;

private String author;

private String publisher;

private int price;

/*默认构造函数*/

public Book() {

super();

}

public Book(String name, String author, String publisher, int price) {

super();

this.name = name;

this.author = author;

this.publisher = publisher;

this.price = price;

}

public Book(int id, String name, String author, String publisher, int price) {

super();

this.id = id;

this.name = name;

this.author = author;

this.publisher = publisher;

this.price = price;

}

/*对象属性操作*/

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public String getPublisher() {

return publisher;

}

public void setPublisher(String publisher) {

this.publisher = publisher;

}

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

}

}

数据访问层data access object(dao)—BaseDao.java

package dao;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class BaseDao {

// 数据库驱动

private static final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

// 连接数据库的url路径

private static final String url = "jdbc:sqlserver://localhost:1433;DatabaseName=MyDB";

// 用户名

private static final String user = "sa";

// 密码

private static final String password = "sqlpass";

// 在静态块中完成驱动的加载

// 静态块中的业务逻辑在类加载器加载类的时候执行

// 只会执行一次

static {

try {

Class.forName(driver);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

protected Connection conn;

protected PreparedStatement pstmt;

protected ResultSet rs;

// 该函数负责创建Connection对象

protected void getConnection() {

if (conn == null) {

try {

conn = DriverManager.getConnection(url, user, password);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

protected void getPreparedStatement(String sql) {

if (conn == null) {

getConnection();

}

try {

pstmt = conn.prepareStatement(sql);

} catch (SQLException e) {

e.printStackTrace();

}

}

// 该函数适合没有占位符的查询语句

protected void getResultSet(String sql) {

if (pstmt == null) {

getPreparedStatement(sql);

}

try {

rs = pstmt.executeQuery();

} catch (SQLException e) {

e.printStackTrace();

}

}

protected void close() {

if (rs != null) {

try {

rs.close();

rs = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

if (pstmt != null) {

try {

pstmt.close();

pstmt = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

if (conn != null) {

try {

conn.close();

conn = null;

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

dao层实例接口–IBookDao.java

package dao;

import java.util.ArrayList;

import entity.Book;

public interface IBookDao {

public ArrayListqueryBooksByPublihser(String publisher);

}

dao层接口实现 \impl\BookDaoImpl.java–

package dao.impl;

import dao.BaseDao;

import entity.Book;

import dao.IBookDao;

import java.sql.SQLException;

import java.util.ArrayList;

public class BookDaoImpl extends BaseDao implements IBookDao {

@Override

public ArrayListqueryBooksByPublihser(String publisher) {

ArrayListbookList = new ArrayList();

String sql = "select * from tbook where publisher=?";

getPreparedStatement(sql);

try {

pstmt.setString(1, publisher);

rs = pstmt.executeQuery();

/*循环读取数据*/

while (rs.next()) {

int id = rs.getInt("id");

String name = rs.getString("name");

String author = rs.getString("author");

String publisherval = rs.getString("publisher");

int price = rs.getInt("price");

Book book = new Book(id, name, author, publisherval, price);

bookList.add(book);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 释放连接资源

close();

}

/*返回bookList*/

return bookList;

}

}

本文精华Mark:线程池 – datasource\ThreadLocalData.java

package datasource;

import dao.*;

import service.*;

public class ThreadLocalData {

//与控制层相连,静态对象

public static ThreadLocalthreadLocalBookService = new ThreadLocal();

//与业务逻辑层相连,静态对象

public static ThreadLocalthreadLocalBookDao = new ThreadLocal();

}

业务逻辑层service – IBookService接口

package service;

import java.util.ArrayList;

import entity.Book;

public interface IBookService {

public ArrayListqueryBooksByPublihser(String publisher);

}

本文精华Mark:业务逻辑层service – BookServiceImpl接口的实现

package service.impl;

import java.util.ArrayList;

import dao.IBookDao;

import dao.impl.BookDaoImpl;

import datasource.ThreadLocalData;

import entity.Book;

import service.IBookService;

public class BookServiceImpl implements IBookService {

@Override

public ArrayListqueryBooksByPublihser(String publisher) {

IBookDao bookDao;

//在线程池中获取key-value的键值,不存在新建threadLocal对象

if (ThreadLocalData.threadLocalBookDao.get() == null) {

bookDao = new BookDaoImpl();

ThreadLocalData.threadLocalBookDao.set(bookDao);

}

//从threadLocal对象中取值

bookDao = ThreadLocalData.threadLocalBookDao.get();

//返回BookList列表

return bookDao.queryBooksByPublihser(publisher);

}

}

本文精华Mark:控制层control control\BookServlet.java

package control;

import java.awt.print.Book;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import datasource.ThreadLocalData;

import service.IBookService;

import service.impl.BookServiceImpl;

@SuppressWarnings("serial")

public class BookServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*中文编码UTF-8*/

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();

String publisher = request.getParameter("publisher");

/*Book接口对象service*/

IBookService bookService;

/*如果线程池中找不到实例对象,则新建*/

if (ThreadLocalData.threadLocalBookService.get() == null) {

bookService = new BookServiceImpl();

ThreadLocalData.threadLocalBookService.set(bookService);

}

/*从线程池中取值*/

bookService = ThreadLocalData.threadLocalBookService.get();

/*bookService调用queryBookByPublisher方法后返回BookList列表*/

ArrayList.Book> books = bookService.queryBooksByPublihser(publisher);

/*绑定对象*/

request.setAttribute("books", books);

/*重定向*/ request.getRequestDispatcher("/result.jsp").forward(request, response);

out.flush();

out.close();

}

}

result.jsp [JSTL库]

"java" import="java.util.*" pageEncoding="UTF-8"%>

"c" uri="http://java.sun.com/jsp/jstl/core"%>

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'result.jsp' starting pagetitle>

width:800px;

height:600px;

margin:0 auto;

}style>

head>

查询结果h1>

IDtd>

NAMEtd>

AUTHORtd>

PUBLISHERtd>

PRICEtd>

tr>

${book.id}td>

${book.name}td>

${book.author}td>

${book.publisher}td>

${book.price}td>

tr>

c:forEach>

table>

div>

body>

html>

四:小结

1)服用方式:结合前篇博文一起服用,记得参考思维导图,效果更佳;

2)有效日期:2XXX-XX-XX;

3)详情咨询:[email protected] 欢迎打扰;

4)版权所有:如有雷同,纯属巧合;

5)如何修改:如有更好的实现方法或者实例,请fork;

6)本人撰博纯属巧合;

7)如有不足之处,提出必改正;

8)后续内容:Ajax[异步js and xml]引擎访问数据数内容;

9)附上层与层之间的逻辑图[request,response],请参见下图;

58085591c13b46628bd368f0cfeac15b.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值