数据库连接使用问题 - 1

原理       

 open-in-view 是 Spring Boot ⾃动加载 Spring Data JPA 提供的⼀个配置,全称为 spring.jpa.open-in-view=true,它只有 true 和 false 两个值,默认是 true。
        这个配置为true时,会导致Web MVC请求处理的一开始,就从连接池取一个数据库连接放到本地线程变量;Web MVC请求处理结束后,才会归还给连接池
open-in-view 机制是为了解决在 mvc 的 controller 中使用了 hibernate 的 lazy load 的属性时 no session 抛出的LazyInitializationException 异常

        这个处理逻辑位于OpenEntityManagerInViewInterceptor.preHandle,在Sentinel处理代码SentinelResourceAspectExt之前,所以Sentinel限流无法阻止JPA取数据库连接。
 

隐患一


        如果业务代码中,有耗时操作,就导致数据库连接还回连接池变慢,进而引起雪崩效应,导致tomcat处理线程大量增加,而处理性能却无法提高,所有Web MVC请求都无法响应,应用提供的服务中断。

@ResponseBody
@RequestMapping(value = "/xxx/send", method = RequestMethod.POST)
@SentinelResource(value = "xxxdcc#send", entryType = EntryType.IN)
public SendXXXResp sendSms(@RequestBody SendXXXVo sendXXXVo) {//同步调用第三方系统,耗时超过一定时间,如3sSendXXXResp sendXXXResp = new SendXXXResp();return sendXXXResp;
}

        如果数据库连接池最大连接数为200,同步调用第三方系统耗时3s。那么这个接口的QPS达到70时,会导致应用雪崩,整个应用无法提供服务。

隐患二

        当jpa与mybatis等框架混合使用时,存在死锁的问题。一个Web MVC请求处理时,JPA框架会从连接池中取一个数据库连接放入本地线程变量,业务处理代码使用mybatis访问数据库,也需要取一个数据库连接,在极端情况下,取不到就会等待,导致JPA取的连接也没有还给连接池,导致死锁。
也会导致tomcat处理线程大量增加,而处理性能却无法提高,所有Web MVC请求都无法响应,应用提供的服务中断。
示例代码:

@ResponseBody
@RequestMapping(value = "/xxx/send", method = RequestMethod.POST)
@SentinelResource(value = "xxx#send", entryType = EntryType.IN)
public SendXXXResp sendSms(@RequestBody SendSmsVo sendSmsVo) {//使用mybatis框架访问数据库CallingConfig callingConfig=callingConfigMapper.selectById(sendXXXVo.getXXXAccount());SendXXResp sendXXXResp = new SendXXXResp();return sendXXXResp;
}

        如果数据库连接池最大连接数为200,这个接口QPS达到200。即使方法体中没有耗时操作,也会导致应用雪崩,整个应用无法提供服务。

修改建议
  1. 将spring.jpa.open-in-view配置为false,注意不要设置成了“spring.shardingsphere.jpa.open-in-view”
  2. 不要使用JPA 的关联查询,如不要使用@OneToMany等关联查询的注解。以免open-in-view为false时,出现LazyInitializationException 异常。

annel_account_config账号表与calling_config主叫号码表是一对多的关系;

JPA中设置的关联查询:

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "channelAccountId")
private List<CallingConfigInfo> callingConfigList = new ArrayList<>();

在Controller中进行了查询使用:

ChannelAccountConfigInfo channelAccountConfigInfo= channelAccountConfigRepository.findOne(1L);
List<CallingConfigInfo> callingConfigList = ObjectUtil.getOptional(()->channelAccountConfigInfo.getCallingConfigList()).orElse(new ArrayList<>());
for(CallingConfigInfo callingConfigInfo:callingConfigList){log.info("Calling:"+callingConfigInfo.getCalling());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王中阳Go赠书活动第一期:《TVM编译器原理与实践》

文章目录 前言TVM编译器的实现过程关于《TVM编译器原理与实践》编辑推荐内容简介作者简介图书目录书中前言/序言《TVM编译器原理与实践》全书速览入手《TVM编译器原理与实践》传送门&#xff1a;结束语参加抽奖 前言 随着人工智能的发展&#xff0c;计算机视觉、自然语言处理和…

MySQL复习汇总(图书管理系统)

MySQL图书管理系统&#xff08;49-94&#xff09;源码_71.备份book数据库到e盘的mybook.sql文件(备份文件中要求包含建库命令)-CSDN博客 CROSS JOIN&#xff1a;交叉连接&#xff08;笛卡尔积&#xff09; -- 1、 创建一个名称为book的数据库。 -- 2、 打开book数据库…

Vue2-组件的基本应用

个人练习&#xff0c;仅供参考。 1.先在components中创建公用的内容&#xff08;public.vue&#xff09;。components文件夹下放组件供其他页面调用。 2.在用到组件的页面导入该公用组件&#xff08;import navTitle from "/components/public.vue";&#xff09;。 …

linux账户文件/etc/passwd详解

linux 账户文件/etc/passwd Linux 的/etc/passwd 文件是系统中最重要的文件之一&#xff0c;它存储了系统中所有用户的基本信息&#xff0c;包括用户名、密码、用户 ID、组 ID、主目录、登录 shell。 /etc/passwd 文件中的每行记录对应一个用户 每条记录的格式如下&#xff1a…

论文阅读记录SuMa SuMa++

首先是关于SuMa的阅读&#xff0c;SuMa是一个完整的激光SLAM框架&#xff0c;核心在于“基于面元(surfel)”的过程&#xff0c;利用3d点云转换出来的深度图和法向量图来作为输入进行SLAM的过程&#xff0c;此外还改进了后端回环检测的过程&#xff0c;利用提出的面元的概念和使…

qt-C++笔记之QProcess

qt-C笔记之QProcess code review! 文章目录 qt-C笔记之QProcess一.示例&#xff1a;QProcess来执行系统命令ls -l命令并打印出结果说明 二.示例&#xff1a;QProcess来执行系统命令ls -l命令并打印出结果&#xff0c;代码进一步丰富三.示例&#xff1a;使用 QProcess 在 Qt 中…

scp传输多个文件

要在一个scp命令中传输多个文件&#xff0c;您可以使用通配符(*)或大括号({})来指定多个文件。 使用通配符&#xff1a; scp /path/to/source/directory/* userremote:/path/to/destination/上述命令将传输源目录中的所有文件到远程目标目录。 使用大括号&#xff1a; scp …

构建强大的Python后端分离应用:使用Token实现安全身份验证和权限控制

构建强大的Python后端分离应用&#xff1a;使用Token实现安全身份验证和权限控制 使用Python构建一个强大的后端分离应用&#xff0c;通过使用Token实现安全的身份验证和灵活的权限控制。 什么是前后端分离&#xff1a; 前后端分离是一种软件架构模式&#xff0c;它将应用程…

深入浅出理解Dilated Convolution(空洞卷积,膨胀卷积)

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 github仓库&#xff1a;Multi-Scale Context Aggregation by Dilated Convolutions 图片素材来源&#xff1a;Convolution arithmetic 理解Dilation convolution Dilated Convolution —— 空洞卷积&#xff08;膨…

javaScript:Math工具类方法

1 Math工具类方法: >和其他的类的不同&#xff0c;Math并不是一个构造函数&#xff0c;也就是无法通过new来创建Math的实例 >Math表示的数学&#xff0c;在Math对象中存储了一组数学运算相关的常量的和方法 >这些常量和方法可以直接通过Math来访问 >比如Math.P…

汪林望教授将于每周三以互动问答直播形式教您如何用龙讯旷腾计算软件PWmat计算不同材料性质

打开VX→搜索“汪林望计算讲座”&#xff0c;关注汪老师的频道&#xff0c;每周三下午16:00我们准时直播&#xff01; 大家提前准备好问题&#xff0c;可直接提问讨论&#xff0c;当面请教 汪林望教授 中科院半导体所首席科学家 北京龙讯旷腾科技有限公司创始人 美国劳伦斯…

竹云董事长董宁受邀出席2023粤港澳大湾区创新战略学术研讨暨数字科技发展报告会议

科技与创新共舞&#xff0c;数字与产业交融。12月28日&#xff0c;2023 年粤港澳大湾区创新战略学术研讨暨数字科技发展报告会议在深商报告厅举行&#xff0c;深圳市科学技术协会党组成员、驻会副主席石兴中&#xff0c;深圳市商业联合会副会长、深商总会秘书长石庆&#xff0c…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例&#xff0c;记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有&#xff1a;Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

vue首次加载白屏问题

引言&#xff1a; Vue.js是一种流行的前端开发框架&#xff0c;但在实际开发中&#xff0c;有时会遇到Vue首页白屏问题。本文将深入探讨这个问题&#xff0c;并提供解决方法&#xff0c;帮助开发者快速解决Vue首页白屏问题。 问题描述&#xff1a; Vue首页白屏问题通常是由于以…

电商API接口|电商平台使用的物流API的安全风险

电子商务平台的物流 API 如果出现安全漏洞&#xff0c;则消费者的个人信息会被大量暴露。 物流 API 整合了企业和第三方供应商之间的数据和服务&#xff0c;以解决各种市场需求。如果 电商API 接口集成不当&#xff0c;可能会出现泄露个人身份信息 (PII) 的风险。许多使用 API…

京东商品详情API接口(item_get-获得JD商品详情)电商领域的重要角色

电商API接口在电商领域中扮演着重要的角色&#xff0c;它们为电商平台提供了许多功能和便利。以下是电商API接口的一些主要用途&#xff1a; 商品信息查询&#xff1a;通过API接口&#xff0c;第三方开发者或商家可以查询电商平台上的商品信息&#xff0c;包括商品详情、价格、…

Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler

Spark底层执行原理 学习Spark运行流程 学习链接&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark运行流程 流程&#xff1a; SparkContext想西苑管理器注册并向资源管理器申请运行Executor资源管理器分配Executor&#xff0c;然后资源管理器启动Ex…

系列十四、理解MySQL varchar(50)

一、理解MySQL varchar(50) 1.1、概述 日常开发中&#xff0c;数据库建表是必不可少的一个环节&#xff0c;建表的时候通常会看到设定某个字段的长度为varchar(50)&#xff0c;例如如下建表语句&#xff1a; 那么怎么理解varchar(50)&#xff1f;这个分情况的&#xff0c;MySQ…

PHP+MySQL+Ajax实现注册功能

本文使用原生PHP和mysql数据库&#xff0c;使用jquery的ajax实现注册功能。 注册页面 注册页面由&#xff0c;html表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道&#xff0c;跨网络通信需要路由 路由有三种类型&#xff1a; 1.直连路由。 自动产生的路由&#xff0c;当网络设备连接到同一网络时&#xff0c;他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…