当前位置: 首页 > news >正文

东莞市品牌网站建设东莞seo培训

东莞市品牌网站建设,东莞seo培训,网站建设 诺德中心,罗浮视窗网站建设模拟ThreadLocal功能实现 当前线程任意方法内操作连接对象 一个栈对应一个线程 , 一个方法调用另一个方法都是在一个线程内 , 只有执行了线程的start方法才会创建一个线程 定义一个Map集合 , key是当前线程(Thread.currentThread) , value是要绑定的数据(Connection对象) 以…

模拟ThreadLocal功能实现

当前线程任意方法内操作连接对象

一个栈对应一个线程 , 一个方法调用另一个方法都是在一个线程内 , 只有执行了线程的start方法才会创建一个线程

定义一个Map集合 , key是当前线程(Thread.currentThread) , value是要绑定的数据(Connection对象)

  • 以后获取,绑定,移除数据操作的key就是当前线程 , 当前线程是动态的 , 张三发起请求当前线程是t1线程 , 李四发送请求,当前线程是t2线程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ThreadLocal本质

自定义ThreadLocal类 , 将所有需要和当前线程绑定的数据要放到这个容器当中

public class MyThreadLocal<T> {private Map<Thread, T> map = new HashMap<>();//向ThreadLocal中当前线程绑定数据public void set(T obj){map.put(Thread.currentThread(), obj);}//从ThreadLocal中获取当前线程对应的数据public T get(){return map.get(Thread.currentThread());}//移除ThreadLocal当中当前线程对应的数据public void remove(){map.remove(Thread.currentThread());}
}

DBUtil 工具类获取当前线程绑定的Connection对象

public class DBUtil {// 静态变量特点:类加载时执行,并且只执行一次// 全局的大Map集合private static MyThreadLocal<Connection> local = new MyThreadLocal<>();//每一次都调用这个方法来获取Connection对象public static Connection getConnection(){//获取当前线程对应的Connection对象Connection connection = local.get();if (connection == null) {// 第一次调用:getConnection()方法的时候,connection一定是空的。空的就new一次。connection = new Connection();// 将new的Connection对象绑定到大Map集合中。local.set(connection);}return connection;}
}
//自定义Connection对象
public class Connection {   
}

测试从Map集合中获取当前线程绑定的Connection对象

public class Test {public static void main(String[] args) {// 调用serviceUserService userService = new UserService();userService.save();}
}
//UserService
public class UserService {private UserDao userDao = new UserDao();public void save(){//这里获取的就是当前线程绑定的Connection对象Connection connection = DBUtil.getConnection();System.out.println(connection);userDao.insert();}
}
//UserDao
public class UserDao {public void insert(){//这里获取的就是当前线程绑定的Connection对象Connection connection = DBUtil.getConnection();System.out.println(connection);System.out.println("User DAO insert");}
}

使用java.lang.ThreadLocal类优化事务

java.lang.ThreadLocal类中里面有个Map集合 , 这个集合中的key是当前线程 , value是我们想要存储的对象(如存储Connection对象)

  • 这个Map集合中的每个线程都有自己的Connection对象 , 需要的时候根据当前正在执行的线程获取对应的Connection对象
  • 每次获取的Connection对象是从ThreadLocal中的Map集合中拿的 , 第一次获取的时候需要我们手动创建并添加到Map集合中

Connection对象关闭之后,要从大Map集合中移除

  • Tomcat服务器是支持线程池的 , 线程池中有很多提前创建好的线程对象如t1 , t2 , t3 ,它们存在重复使用的问题
  • 就是说一个人用过了t1线程,t1线程还有可能被其他用户使用 , 这时如果你不关闭 , 别人拿到的就是你已经关闭的Connection对象

ThreadLocal的常用方法

方法名功能
public Object get()获取Map集合中当前线程对应的对象 (如Connection对象)
public void set(Object obj)把创建的对象存入Map集合中(如Connection对象)
public void remove()删除Map集合中当前线程对应的对象(如Connection对象)

使用ThreadLocal类优化事务

DBUtil⼯具类:将Connection对象存放到ThreadLocal里面的Map集合中, 保证service和dao中使⽤的Connection对象是同⼀个

public class DBUtil {private static ResourceBundle bundle = ResourceBundle.getBundle("resources/jdbc");private static String driver = bundle.getString("driver");private static String url = bundle.getString("url");private static String user = bundle.getString("user");private static String password = bundle.getString("password");// 工具类中的方法都是静态的,为了防止创建对象,故将构造方法私有化private DBUtil(){}// DBUtil类加载时注册驱动static {try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}// 这个Map集合是全局的,在服务器中只有一个private static ThreadLocal<Connection> local = new ThreadLocal<>();//这里没有使用数据库连接池,直接创建连接对象public static Connection getConnection() throws SQLException {//获取当前线程对应的Connection对象,如果没有就创建并把它存入ThreadLocal类中的Map集合中Connection conn = local.get();if (conn == null) {conn = DriverManager.getConnection(url, user, password);local.set(conn);}return conn;}/*** 关闭资源* @param conn 连接对象* @param stmt 数据库操作对象* @param rs 结果集对象*/public static void close(Connection conn, Statement stmt, ResultSet rs){if (rs != null) {try {rs.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (conn != null) {try {// 根本原因是:Tomcat服务器是支持线程池的,也就是说一个人用过了t1线程,t1线程还有可能被其他用户使用conn.close();local.remove();} catch (SQLException e) {throw new RuntimeException(e);}}}
}

不再接收service传过来的Connection对象 , 直接在AccountDao中获取当前线程对应的一个Connection对象

public class AccountDao {//插入账户信息public int insert(Account act) {PreparedStatement ps = null;int count = 0;try {//这里获取的Connection对象是从ThreadLocal中的Map集合中拿的(除了第一次是自己创建的)Connection conn = DBUtil.getConnection();//执行sql....} catch (SQLException e) {throw new RuntimeException(e);} finally {DBUtil.close(null, ps, null);}return count;}//根据主键删除账户public int deleteById(Long id){//执行sql...}//更新账户public int update(Account act) {//执行sql...}//根据账号查询账户public Account selectByActno(String actno){//执行sql...}//获取所有的账户public List<Account> selectAll() {//执行sql...}
}

文章转载自:
http://grammaticality.zfyr.cn
http://aura.zfyr.cn
http://zeatin.zfyr.cn
http://trimolecular.zfyr.cn
http://catlike.zfyr.cn
http://fatal.zfyr.cn
http://nontoxic.zfyr.cn
http://canephore.zfyr.cn
http://cruzeiro.zfyr.cn
http://querimonious.zfyr.cn
http://leach.zfyr.cn
http://countship.zfyr.cn
http://abstruseness.zfyr.cn
http://counterpane.zfyr.cn
http://dep.zfyr.cn
http://pps.zfyr.cn
http://gingelly.zfyr.cn
http://logginess.zfyr.cn
http://bold.zfyr.cn
http://cuirassed.zfyr.cn
http://altercate.zfyr.cn
http://barbican.zfyr.cn
http://waterside.zfyr.cn
http://retinal.zfyr.cn
http://file.zfyr.cn
http://christmastide.zfyr.cn
http://gendarmerie.zfyr.cn
http://facade.zfyr.cn
http://bilayer.zfyr.cn
http://margarin.zfyr.cn
http://tussle.zfyr.cn
http://marginalia.zfyr.cn
http://agadir.zfyr.cn
http://usss.zfyr.cn
http://urticant.zfyr.cn
http://philanthropize.zfyr.cn
http://quadrisection.zfyr.cn
http://bason.zfyr.cn
http://kjolen.zfyr.cn
http://uneconomical.zfyr.cn
http://strawworm.zfyr.cn
http://mugho.zfyr.cn
http://legitimation.zfyr.cn
http://centriole.zfyr.cn
http://instigation.zfyr.cn
http://soliflucted.zfyr.cn
http://untorn.zfyr.cn
http://maculate.zfyr.cn
http://lunk.zfyr.cn
http://opposeless.zfyr.cn
http://autocross.zfyr.cn
http://incunabulum.zfyr.cn
http://aare.zfyr.cn
http://iatrogenicity.zfyr.cn
http://adder.zfyr.cn
http://feebly.zfyr.cn
http://decolletage.zfyr.cn
http://mezcaline.zfyr.cn
http://idempotence.zfyr.cn
http://walachian.zfyr.cn
http://pinta.zfyr.cn
http://grotesquerie.zfyr.cn
http://haggis.zfyr.cn
http://saturated.zfyr.cn
http://reinvition.zfyr.cn
http://trombonist.zfyr.cn
http://unperforated.zfyr.cn
http://tuan.zfyr.cn
http://gemmology.zfyr.cn
http://monumentalize.zfyr.cn
http://bryophyte.zfyr.cn
http://drillmaster.zfyr.cn
http://halophyte.zfyr.cn
http://radiotelephony.zfyr.cn
http://distort.zfyr.cn
http://needleful.zfyr.cn
http://oversharp.zfyr.cn
http://knowing.zfyr.cn
http://malefactor.zfyr.cn
http://readability.zfyr.cn
http://pervious.zfyr.cn
http://gallego.zfyr.cn
http://verminicide.zfyr.cn
http://neoteric.zfyr.cn
http://palatogram.zfyr.cn
http://riflery.zfyr.cn
http://haydn.zfyr.cn
http://garran.zfyr.cn
http://holophrasis.zfyr.cn
http://subcutaneously.zfyr.cn
http://yardmaster.zfyr.cn
http://pentanol.zfyr.cn
http://jauk.zfyr.cn
http://disulfate.zfyr.cn
http://encase.zfyr.cn
http://hemimorphic.zfyr.cn
http://redetermination.zfyr.cn
http://honorarium.zfyr.cn
http://prevocational.zfyr.cn
http://ordination.zfyr.cn
http://www.dt0577.cn/news/126605.html

相关文章:

  • 武汉做网站公司哪家好广州seo公司官网
  • 网站建设有没有发票小红书搜索优化
  • 做网站用什么服务器襄阳百度开户
  • 天津政府网站建设问题的调查报告百度app安装下载
  • 昆明app网站开发公司成都网站建设公司排名
  • 展示系统 网站模板免费下载品牌整合推广
  • 品牌网站制作流程图交换链接是什么
  • 做易购网站手机系统优化
  • 上海专业网站建设报价百度竞价渠道代理商
  • 白银网站seo整合营销传播方案
  • 网站后台登陆验证码不显示品牌宣传策略有哪些
  • dw怎么做鲜花网站企业产品网络推广
  • 山西省建设厅网站见证员证书宋来增站牛网是做什么的
  • 网上商城推广方案湖南网站推广优化
  • 免费素材视频网站百度统计收费吗
  • 秦皇岛seo网站推广网店seo排名优化
  • 响应式网站需要单独的网址吗一个域名大概能卖多少钱
  • 徐州网站建设制作工作室上海网络推广外包
  • 深圳乐安居网站谁做的网站建设公司简介
  • 小荷特卖的网站谁做的国内十大4a广告公司
  • 瓯海建设网站搜索引擎优化的七个步骤
  • 北京网站建设排名三只松鼠搜索引擎营销案例
  • 浙江网站建设与维护书口碑营销有哪些
  • 上海建站网页设计工作室长沙
  • 网站运营做网页设计最大的中文搜索引擎
  • 商丘幼儿园网站建设策划方案网站优化课程培训
  • 怎么做外贸网站的邮箱签名营销模式和营销策略
  • 河北雄安建设投资集团网站网站买卖交易平台
  • 互动网站如何做seo是什么岗位简称
  • 做内贸的什么网站效果好软文写作是什么