使用大量 AOP 请求作用域 bean 时出现性能问题

2024-01-21

我正在使用 Spring 3 开发一个半大型应用程序,并且在同时处理数百个用户时遇到性能问题。我正在使用 Spring 的 AOP 代理来使用多个请求范围的 bean,并且我可以看到,每次我对其中一个 bean 调用任何方法时,都会调用 CGLIB 拦截器,然后调用 AbstractBeanFactory.getBean(),后者再调用 add()现有 Spring bean 的同步集。由于此 add() 是同步的,因此当有数千个调用都等待添加到同一列表时,它会有效地锁定服务器。

有没有办法使用请求范围的 bean 来解决这个问题?我在Spring文档中读到,如果bean实现任何接口(http://static.springsource.org/spring/docs/2.0.0/reference/aop.html#d0e9015),则不使用CGLIB,但我的请求范围bean所有人都实施了一种(实际上是同一种),而且这种情况仍在发生。我确实需要将这些 Bean 限定在请求范围内,因为它们的某些字段是在应用程序的某一部分针对特定请求计算的,然后我使用 SpEL 在同一请求期间在应用程序的不同部分获取它们的值。我想如果我将 beans 原型设置为作用域,那么当我第二次使用 SpEL 获取它们时,我就会得到一个新的对象。

这是说明我的问题的代码示例。请参阅最后两行评论,描述我到底遇到问题的地方。

<!-- Spring config -->
<bean name="someBean" class="some.custom.class.SomeClass" scope="request">
    <property name="property1" value="value1"/>
    <property name="property2" value="value2"/>
    <aop:scoped-proxy/>
</bean>

<bean name="executingClass" class="some.other.custom.class.ExecutingClass" scope="singleton">
    <property name="myBean" ref="someBean" />
</bean>


public Interface SomeInterface {
    public String getProperty1();
    public void setProperty1(String property);
    public String getProperty2();
    public void setProperty2(String property);
}

public class SomeClass implements SomeInterface {
    private String property1;
    private String property2;

    public String getProperty1() { return propery1; }
    public void setProperty1(String property) { property1=property;}

    public String getProperty2() { return propery2; }
    public void setProperty2(String property) { property2=property;}
}


public class ExecutingClass {
    private SomeInterface myBean;

    public void execute() {
        String property = myBean.getProperty1(); // CGLIB interceptor is invoked here, registering myBean as a bean
        String otherProperty = myBean.getProperty2(); // CGLIB interceptor is invoked here too!  Seems like this is unnecessary. And it's killing my app.
    }
}

我的想法是以下之一:

  • 我可以在不代理对 bean 进行的每个方法调用的情况下发出范围限定的 Spring Bean 请求吗?并且不将每个方法标记为“最终”?

or...

  • 我可以重写 Spring 的 bean 工厂来实现 Bean 缓存吗?该缓存将在调用 AbstractBeanFactory.getBean() 之前检查 bean 是否已缓存?如果是这样,我在哪里配置 Spring 来使用我的自定义 bean 工厂?

事实证明,Spring 实际上确实在请求属性中缓存了请求范围的 bean。如果您好奇,请看一下 AbstractRequestAttributesScope,它是 RequestScope 的扩展:

public Object get(String name, ObjectFactory objectFactory) {
    RequestAttributes attributes = RequestContextHolder.currentRequestAttributes();
    Object scopedObject = attributes.getAttribute(name, getScope());
    if (scopedObject == null) {
        scopedObject = objectFactory.getObject();
        attributes.setAttribute(name, scopedObject, getScope());
    }
    return scopedObject;
}

因此,虽然由于 aop 代理,AbstractBeanFactory.getBean() 在每个 bean 方法调用中都会被调用,但如果在请求属性中尚未找到该 bean,它只会导致 Spring 添加到该同步集。

避免对我的请求作用域 bean 上的每个方法调用进行代理仍然会降低复杂性,但有了此缓存,对性能的影响将很小。我认为如果我想要大量请求范围的 bean 并且仍然一次服务大量请求,那么我将不得不忍受缓慢的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用大量 AOP 请求作用域 bean 时出现性能问题 的相关文章

  • Firebase 实时数据库 .info/connected 本应为 True 时为 False

    我有一个 Android 服务 它的调用地址为onCreate FirebaseDatabase database FirebaseDatabase getInstance database getReference info connec
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • 使用 WebDriver 暂时绕过隐式等待

    当使用隐式等待时 正如这里所建议的 https stackoverflow com a 10950905 56285 我仍然有时想要断言即时元素不可见或不存在 换句话说 我know有些元素应该隐藏 并希望我的测试做出这样的断言fast 而不
  • 在名称为 [重复] 的 DispatcherServlet 中未找到带有 URI 的 HTTP 请求的映射...

    这个问题在这里已经有答案了 我已经检查了 stackoverflow 上几乎所有相关文章 但我就是无法解决我的问题 这是代码 网络 xml
  • 写入作为 Jar 文件中的资源包含的 Java 属性文件

    有没有办法修改作为资源存储在 Jar 文件中的属性文件中的属性值 这就是我正在尝试处理的场景 我有一个属性文件作为资源存储在我的 Jar 文件中 有一些系统特定的属性 例如路径 我希望能够为我想要运行 Jar 文件的系统更改此设置 最好的解
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 使用 Oracle Wallet 身份验证从 Spring-jdbc 连接到 Oracle DB

    我将 Spring jdbc 与 org apache commons dbcp BasicDataSource 结合使用 使用用户名和密码进行连接 我想使用BasicDataSource 因为我只有一个连接 我有这个代码
  • 如何从 Jackson 中的自定义解串器调用默认解串器

    我在杰克逊的自定义解串器有问题 我想访问默认序列化器来填充我要反序列化的对象 在填充之后 我将做一些自定义的事情 但首先我想使用默认的 Jackson 行为反序列化对象 这是我目前拥有的代码 public class UserEventDe
  • 从多个地方绘制 JPanel

    我目前正在为学校开发一款 Java 2D 游戏 我们必须使用抽象工厂设计模式 对于 2D 实现 我使用工厂如下 public class Java2DFact extends AbstractFactory public Display d
  • HYBRIS - 组件和插槽如何在 JSP 文件中工作?

    最近我正在使用 Hybris 我无法理解这些组件是如何工作的 我知道如何创建和定义一个 如何将它们添加到我想要的页面等 但我不明白如何使用该标签
  • 带有 Spring 的 Tomcat

    我有一个在 Tomcat 中托管的 3 层应用程序 Web 服务和 DAO 层 如何整合Tomcat和Spring 我需要利用Spring的依赖注入 事务管理等 我只能想到实例化 ClassPathXmlApplicationContext
  • 如何告诉 Eclipse 忽略 Ant build.xml 中的错误?

    我有一个使用 Maven 构建的 Eclipse 项目 并且我在 Eclipse 中使用 m2eclipse 插件来获得 Maven 支持 然而这个项目还包含一个build xml它并不用于实际构建项目 而只是用于编写脚本功能 作为项目开发
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 从 Brixton.RC1 开始的 ZuulProxy 未传递授权标头

    从 Spring Cloud 切换时Brixton M5 to Brixton RC1我的 ZuulProxy 不再通过Authorization标头下游到我的代理服务 我的设置中有各种各样的角色 但大多数都相当简单 Authorizati
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 尝试接收 UDP 多播时出现空指针异常

    在尝试了几次让简单的 UDP 多播接收器工作后 我感到很困惑 在我自己的代码无法按预期工作后 我尝试了 vertx 文档中发布的确切示例 DatagramSocket socket vertx createDatagramSocket ne
  • Web 服务返回 java.lang.reflect.InitationTargetException

    我在向 java web 服务发出请求时收到上述消息 我们最初创建了一个 Java 控制台应用程序并手动提交了一个 xml 文件 当将其作为 Java 应用程序运行时 将使用 System out println 成功创建并显示响应 我们通
  • 在Java中将32bpp图像转换为16bpp图像

    如何使用 Java 库将 32bpp 图像 ARGB 转换为 16bpp 图像 ARGB 出于我的好奇 在像素级别 这种转换有什么作用 如果我有一个保存像素值 包含所有通道 的 int 值 那么在转换发生后该 int 会有什么不同 32 位

随机推荐

  • 无法使用 UPDATE 更改 MySQL 上的用户密码

    在 MySql 5 7 17 下 上述指令不起作用 并且我总是没有收到任何反馈或以下错误消息 错误 1064 42000 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 UPDATE mysql user
  • 如何使用 ps -axl 查找 Linux 上运行的 Java 线程?

    我有一个正在运行的 JVM 有两个线程 是否可以使用 ps axl 在我的 Linux 操作系统上查看这些正在运行的线程 我试图找出操作系统赋予我的线程的优先级 有关此其他问题的更多信息here https stackoverflow co
  • Error 方法内的 fmt.Sprint(e) 产生的无限循环

    根据四十四十的回复这个问题 https stackoverflow com questions 27474907 error infinite loop fmt Sprint e 将会通知e Error 转换值e to a string 如
  • 更改 pandas 中箱线图的面色

    我需要更改使用绘制的箱线图的颜色pandas实用功能 我可以使用以下命令更改大多数属性color争论但不知道如何改变facecolor盒子的 有人知道该怎么做吗 import pandas as pd import numpy as np
  • 将 SAML 身份验证添加到 .net WebAPI

    我需要将 SAML 身份验证添加到我的 Web 应用程序 WebAPI 后端 Angular 前端 并使用 Azure AD 作为我的身份提供商 我计划使用 Sustainsys Saml2 库 但我不确定如何正确使用该库提供的方法 我已将
  • 计算 Modbus RTU CRC 16

    我正在实现一个软件 可以通过串行方式读取和写入 Modbus RTU 协议中的数据 为此 我需要计算字节字符串末尾的两个 CRC 字节 但我无法执行此操作 在网上搜索 我发现两个函数似乎可以正确计算 CRC WORD CRC16 const
  • 如何使用 Google API PHP 客户端库和 Youtube API V3 将视频上传到 YouTube?

    尝试简单地使用上传视频Google API PHP 客户端 最新版本 1 1 6 https github com google google api php client releases but Youtube API V3 中的代码
  • 填充/大小/边距,当使用 ToolstripControlHost 作为弹出控件时

    我正在使用 VB2008 Express 我一直在研究一个 弹出窗口 来选择日期范围 DateTimePicker 并不理想 因为其目的是选择一个日期范围 该范围始终是一整周 从星期日到星期六 控制效果很好 我对此感到非常自豪 我的问题与使
  • React Suspense 未按预期工作

    我想在我的Powers正在获取 未定义 我实施了React Suspense按照我的逻辑 使用代码
  • 如何在 DataGrid 中的按钮上设置 CssClass

    我在 DataGrid 中有一个 ButtonColumn
  • React Native - Redux - 无法访问状态变量

    情况 我正在尝试在我的 React Native 应用程序中实现 redux 状态管理 下面的例子非常简单 当用户登录时 应用程序会将授权令牌保存到 keychain keystore 以及 redux store 中 按照教程 我创建了以
  • 在字符串插值中转义美元符号

    如何在字符串插值中转义美元符号 def getCompanion name String Class forName s my package name gt error unclosed string literal 只需加倍即可 sca
  • 嵌入式与非嵌入式 Java 服务器

    我正在开发一个 Java 项目 并一直使用 Tomcat 服务器进行本地测试 然而我正要升级到 Heroku 并发现一篇文章 https devcenter heroku com articles create a java web app
  • Python:通过局域网连接?

    只是这个问题的前言 我不知道我在做什么 所以请原谅任何愚蠢的行为 我正在制作一个基于套接字的聊天室 我想在本地网络上使用它 我爸爸的计算机和我的计算机通过同一个 wifi 连接 这是服务器代码 import socket import sy
  • 在抽象基类中定义的 clr 属性的 Setter,仅具有 getter

    有没有办法为在抽象基类中定义的仅具有 getter 的 clr property 声明 setter 反之亦然 abstract class BaseClass public abstract string Test get class C
  • 仅命名“gitbranch--list”选项?

    git branch输出分支列表 但也输出其他以人为本的绒毛 例如星号 在当前分支旁边 git branch HEAD detached at origin master branch foo some branch bar 如何获得更多机
  • 如何使用批处理或 PowerShell 从文本文件中删除换行符

    本质上 我想从 file txt 中读取内容 apple banana carrot 并写入 newfile txt 以便它包含内容 apple banana carrot 我需要在没有安装权限的 Windows 计算机上执行此操作 I t
  • SQL 数据库系统中临时表的用例有哪些?

    使用临时表的主要目的是什么 我想知道临时表在小型和大型公司的实际软件中的实际和商业用途 根据我的经验 临时表通常用于存储一系列复杂的 CREATE 或 UPDATE 查询中的中间计算 这些查询会产生某种分析结果 一个示例可能是为 OLAP
  • const 成员函数优先于返回值类型匹配

    In Y test1 非常数X operator void 优先于看似更好的匹配 X operator bool const 这是为什么 标准中在哪里描述了这种现象 include
  • 使用大量 AOP 请求作用域 bean 时出现性能问题

    我正在使用 Spring 3 开发一个半大型应用程序 并且在同时处理数百个用户时遇到性能问题 我正在使用 Spring 的 AOP 代理来使用多个请求范围的 bean 并且我可以看到 每次我对其中一个 bean 调用任何方法时 都会调用 C