ConcurrentHashMap<>()线程安全的Map,高并发下使用
Hashtable<>()也是线程安全的集合
一般Map方法
线程中,创建随机数,获取当前线程名,线程名和随机数保存到Map---线程名和随机数关联
main方法中调用3个线程Task
Task中创建OrderService---输出获取线程名和对应的管理数据
ThreadLocal
ThreadLocal<T>可以指定,关联的数据的类型
一个ThreadLocal只能关联一个线程关键数据
输出的是bbj
关联多个数据,需要用多个ThreadLocal
在订单过程的三层结构中,输出线程名
以生成订单距离,事务问题
1.ThreadLocal 关联连接和线程,确保整个订单过程使用一个连接、
订单过程中,线程始终不变
:将JDBC的连接通过ThreadLocal 建立关联
1. 获取连接时,通过ThreadLocal获取,ThreadLocal没有关联,再去找Druid连接池------------保证一旦关联上线程,后面用到连接的地方,都使用同一个连接。
获取连接的同时 设置手动管理事务 setAutoCommit()
2. 将释放连接分别和提交、回滚绑定-----作为方法放入工具类JdncUtils中
2. 在JdbcUtils工具类中,创建 提交+释放连接 和 回滚+释放连接
3. 在 orderService.createOrder() 被调用处 try...catch 捕获异常
4. 每个修改数据库的Dao,都是调用BaseDao的update通用方法----------update方法也需要向上抛出异常
BaseDao中操作数据库的方法中,不能关闭连接,需要在提交和回滚时,才能关闭,而且要抛出异常---供service处捕获
异常捕获说明:
jdbc操作-----实际调用update----update需要抛异常
一系列jdbc操作出现异常
update异常-----向上抛出------saveOrder:return给OrderService.CreaterOrder() --------- 在调用处,需捕获异常
没有异常--------提交事务
有异常--------回滚事务
在创建连接时----JdbcUtils中getConnnection ---- 就设置手动管理实务
一系列Jdbc操作---OrderServiceImpl中--- 例如OrderService.createOrder()
一个一个添加try...catch太麻烦
二、
给 doFilter() 的 chain.diFilter() 配置try...catch,有异常就回滚事务,每异常就提交事务
配置try...catch过滤.---------/* 当前工程目录下的所有文件
注意:中途,如果异常被处理:(如在BaseServlet中类处理,就需要抛出异常),必须保证,修改数据库的操作中的异常,抛出到Filter过滤器中处理
error-page标签配置,服务器出错后,自动跳转的页面
错误友好页面
doFilter()处捕获的异常,做回滚处理后,继续向上抛给Tomact服务器
添加商品到购物车---原方法---给按钮添加点击事件 location.href 请求到CartServlet
使用Ajax 在最后,不用重定向,而使用json回传