2014-03-03 5 views
0

Мой английский не очень хорош. Код сначала.Вызвать метод весной mvc service cost too much time

@ResponseBody 
    @RequestMapping(value = "testcall") 
    public UnifiedResponse testMethodCall(
      HttpServletRequest request, 
      HttpServletResponse response) { 
     UnifiedResponse unifiedResponse = new UnifiedResponse(); 
     logger.info("t1:"+System.currentTimeMillis()); 
     Fun(0,1452,"abd",1); 
     logger.info("t2:"+System.currentTimeMillis()); 
     userSignService.testcall(); 
     logger.info("t3:"+System.currentTimeMillis()); 

     return unifiedResponse; 
    } 


    String Fun(int i,long l,String s,int ii){ 
     logger.info("f1:"+System.currentTimeMillis()); 
     return ""; 
    } 

и войти выход:

t1:1393816077311 
f1:1393816077312 
t2:1393816077312 
f2:1393816077345 
t3:1393816077410 

testcall() является способ, в службе, ни с параметром, ни возвращаемое значение. просто выведите метку времени.

Сервис реализован так:

@Service 
public class UserSignServiceImpl extends BaseServiceImpl implements IUserSignService { 
public void testcall() { 
    logger.info("f1:"+System.currentTimeMillis()); 
} 

} 

инстанцирован путем аннотирования

@Autowired 
IUserSignService userSignService; 

Это только случается на некоторых серверах. На других t3-t1 меньше 2 мс. Все серверы используют ту же версию JDK и Resin.

Почему?

трассировки стека между вызывающим и метод:

UserSignServiceImpl.testcall() line: 448  
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 319 
ReflectiveMethodInvocation.invokeJoinpoint() line: 183 
ReflectiveMethodInvocation.proceed() line: 150 
TransactionInterceptor.invoke(MethodInvocation) line: 110 
ReflectiveMethodInvocation.proceed() line: 172 
ExposeInvocationInterceptor.invoke(MethodInvocation) line: 90 
ReflectiveMethodInvocation.proceed() line: 172 
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 202 
$Proxy49.testcall() line: not available 
OtherController.testMethodCall(HttpServletRequest, HttpServletResponse) line: 6329 
+0

Откуда у пользователя 'userSignService'? – Makoto

+0

открытый интерфейс IUserSignService; реализовать: @Service public class UserSignServiceImpl extends BaseServiceImpl реализует IUserSignService – user3373353

+0

Достаточно честный, но я не вижу, где он объявлен или создан. Без этого нет разумного способа ответить на этот вопрос. – Makoto

ответ

0

Причина в том, перехватчик. Как только я удалю его, t3-t2 до 1 мс. org.springframework.orm.hibernate3.HibernateTransactionManager Все методы в пакете com.xxx.service вызовут этот менеджер. Я не знаю внутренних механизмов, но я думаю, это может быть так: Серверный процесс быстрее имеет 12M L3 Кэш в процессоре, тем медленнее нет. Методы обслуживания называются везде, что делает его наиболее часто используемым. Более быстрый сервер может кэшировать его, поэтому процесс быстрее. Я не уверен. Есть ли какое-то объяснение?