【发布时间】:2019-05-18 09:00:05
【问题描述】:
在 SpringMVC 服务中进入一个方法和退出该方法花费了太多毫秒。但是,如果我将方法修改为静态,则只需 1 毫秒。 我们的项目是一个SpringMVC-Mybatis项目。我发现控制器进入一个服务方法和退出该方法大约需要70毫秒。 该方法从具有 128 个键的静态映射中获取值。
@Controller
public class OrdersController extends BaseAction
{
@Autowired(required=false)
private CompanyService<Company> companyService;
public void validateInfo()
{
Company company = CompanyService.queryByIdFromCache(account);// cost about 70 milliseconds, but if the method is static it is 1 milliseconds.
}
}
@Service("companyService")
public class CompanyService<T> extends BaseService<T>
{
private static ConcurrentMap<Integer, Company>cache = new ConcurrentHashMap<>(); //map with 128 keys
public Company queryByIdFromCache(Integer id)
{
return cache.get(id);
}
}
我希望该方法在 2 毫秒内完成。 该服务在单例模式下工作。和 companyService 是同一个实例。 我不想把所有的方法都改成静态方法,因为有些代码必须用非静态的方式调用。
【问题讨论】:
-
一种可能的解释是 Spring Bean 被创建为代理。因此,他们不能代理
static方法。这意味着如果方法是static,它不会被代理,因此不必被拦截(这会花费额外的时间和资源)。您可以尝试在方法内设置断点,并使用AopUtils.isAopProxy()或类似方法来验证这一点。 -
你是如何开始测量的?
-
@Eugene
JIT与确定他的OrdersController是否被 Spring 代理有什么关系? -
@user991710,我会试试的。谢谢。
-
@Eugene:对不起,我已经删除了日志。
标签: java spring profiling benchmarking static-methods