我有带 CMT 的 EJB RESTEasy 控制器。
在 DB 中创建一些实体的一种关键方法在单次调用时工作良好且快速。
但是当我尝试由 10 个用户同时调用它时,它的工作速度非常慢。
我在日志中跟踪了时间,与单次调用相比,扩展最多的地方是从 RESTeasy 控制器退出和进入 MainFilter 之间的延迟。
所以这个延迟从单次调用的 0-1 毫秒增加到 8 秒。10个同时调用!
我需要想法可能是什么原因以及如何加快速度。
我有带 CMT 的 EJB RESTEasy 控制器。
在 DB 中创建一些实体的一种关键方法在单次调用时工作良好且快速。
但是当我尝试由 10 个用户同时调用它时,它的工作速度非常慢。
我在日志中跟踪了时间,与单次调用相比,扩展最多的地方是从 RESTeasy 控制器退出和进入 MainFilter 之间的延迟。
所以这个延迟从单次调用的 0-1 毫秒增加到 8 秒。10个同时调用!
我需要想法可能是什么原因以及如何加快速度。
根据上面的一些评论,听起来确实可能是数据库锁定问题。根据您所说,“滞后”发生在控制器和调用控制器的过滤器之间。大概这就是事务提交发生的地方。
但是,您说代码在数据库中创建了一些实体,但您没有说代码是否进行了任何更新或选择。仅仅进行插入通常不会对大多数数据库造成锁定问题,除非有相关的更新或选择(即在 Oracle 中选择更新)。
检查并查看是否有任何资源(如键表或正在更新的父记录)可能导致问题。
还要检查您的 JDBC 文档。大多数 JDBC 驱动程序都有日志记录级别,可以让您看到正在数据库上执行的操作。虽然这可能会生成相当大的日志,但如果您在日志中包含线程标识符,您应该能够看到问题发生在哪里。
我的直接反应是这是一个数据库锁定问题。您能否判断当控制流通过事务边界时是否会出现延迟?尝试使用打印语句乱扔代码的旧技术,看看事情何时停止。
锁定resteasy线程的争用?数据库?很难预测瓶颈在哪里。