2013-05-10 2 views
5

के साथ वसंत 3 एनपीई मैं जेपीए के साथ स्प्रिंग 3 का उपयोग कर रहा हूं और मुझे अपने वेब एप्लिकेशन में एक अड़चन समस्या दिखाई दे रही है। मेरे पास जेपीए एंटिटी मैनेजर के लिए रैपर है जो अंतर्निहित EntityManager क्रूड विधियों को कॉल करता है। मैं कभी-कभी एनपीई देखता हूं जब मैं entityManager.persist(object); पर कॉल करता हूं ऐसा लगता है कि डेटाबेस कनेक्शन खो गया है लेकिन मैं 100% कारण नहीं हूं। किसी के पास कोई अपवाद है जिसके कारण नीचे अपवाद हो सकता है?LazyConnectionDataSourceProxy AutoCommit

स्प्रिंग संस्करण: 3.0.6.RELEASE

स्प्रिंग 3 LazyConnectionDataSourceProxy.java लाइन 416:

if (this.autoCommit != null && this.autoCommit != this.target.getAutoCommit()) { 
    this.target.setAutoCommit(this.autoCommit); 
} 

अपवाद:

Caused by: java.lang.NullPointerException 
     at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:416) 
     at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376) 
     at $Proxy64.prepareStatement(Unknown Source) 
     at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
     at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.java:145) 
     at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96) 
     at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122) 
     at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49) 
     at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:154) 
     at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:110) 
     at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61) 
     at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:646) 
     at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:620) 
     at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:624) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220) 
     at sun.reflect.GeneratedMethodAccessor101.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:592) 
     at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
     at $Proxy79.persist(Unknown Source) 
     at myapp.api.dao.impl.GenericDAOImpl.save(GenericDAOImpl.java:50) 
     at sun.reflect.GeneratedMethodAccessor100.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:592) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
     at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at $Proxy119.save(Unknown Source) 
     at myapp.api.service.impl.backoffice.StoringServiceImpl.store(StoringServiceImpl.java:89) 
     at myapp.api.service.impl.backoffice.StoringServiceImpl.storeIncludedFeatureMessage(StoringServiceImpl.java:68) 
     at sun.reflect.GeneratedMethodAccessor124.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:592) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at $Proxy168.storeIncludedFeatureMessage(Unknown Source) 
     at myapp.api.listener.backoffice.StorableMessageListener.processNew(StorableMessageListener.java:136) 
     at myapp.api.listener.backoffice.StorableMessageListener.onMessage(StorableMessageListener.java:187) 
     ... 34 more 

स्प्रिंग विन्यास:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:hz="http://www.hazelcast.com/schema/spring" 
     xsi:schemaLocation=" 
     http://www.hazelcast.com/schema/spring 
     http://www.hazelcast.com/schema/spring/hazelcast-spring-2.5.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

     <!-- Generic --> 
     <context:annotation-config /> 
     <context:component-scan base-package="myapp.api" /> 
     <aop:aspectj-autoproxy/> 

     <!-- JPA --> 
     <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

     <tx:annotation-driven /> 

     <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
      <property name="persistenceUnitName" value="MyApp" /> 
      <property name="jpaProperties"> 
       <props> 
        <prop key="hibernate.use_sql_comments">true</prop> 
        <prop key="hibernate.generate_statistics">true</prop> 
        <prop key="hibernate.archive.autodetection">class</prop> 
        <prop key="hibernate.cache.use_second_level_cache">true</prop> 
        <prop key="hibernate.cache.provider_class">com.hazelcast.hibernate.provider.HazelcastCacheProvider</prop> 
        <prop key="hibernate.cache.use_query_cache">true</prop> 
        <prop key="hibernate.cache.use_minimal_puts">true</prop> 
       </props> 
      </property> 
     </bean> 


     <hz:hazelcast id="instance"> 
      <hz:config> 
       //rest of Hazelast config here 
      </hz:config> 
     </hz:hazelcast> 

     <hz:hibernate-region-factory id="regionFactory" instance-ref="instance"/> 

     <!-- Define JPA Provider Adapter --> 
     <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.OracleDialect" /> 
     </bean> 

     <bean id="dataSourceTarget" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
      <property name="URL" value="jdbc:oracle:thin:@server:1525:name" /> 
      <property name="user" value="test" /> 
      <property name="password" value="123" /> 
      <property name="connectionCachingEnabled" value="true" /> 
      <property name="connectionCacheProperties"> 
       <props merge="default"> 
        <prop key="MinLimit">5</prop> 
        <prop key="MaxLimit">50</prop> 
       </props> 
      </property> 
     </bean> 

     <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
      <property name="targetDataSource" ref="dataSourceTarget"/> 
     </bean> 


     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
      <property name="entityManagerFactory" ref="entityManagerFactory"/> 
      <property name="dataSource" ref="dataSource"/> 
     </bean> 

     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/> 

     <bean id="genericDAO" class="myapp.api.dao.impl.GenericDAOImpl"> 
      <constructor-arg> 
       <value>java.io.Serializable</value> 
      </constructor-arg> 
     </bean> 

     <bean id="springContextHolder" class="myapp.api.util.SpringContextHolder" factory-method="getInstance" /> 

<bean id="executionInterceptor" class="myapp.api.listener.backoffice.ExecutionInterceptor" /> 

     </beans> 

AOP त्रुटि हैंडलर:

package myapp.api.listener.backoffice; 


import javax.jms.Message; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.util.StopWatch; 

@Aspect 
public class ExecutionInterceptor extends BaseListener{ 
    //protected Log log = LogFactory.getLog(this.getClass()); 
    private String errorDestination="ErrorQ"; 
    @Autowired 
    @Qualifier("jmsTemplate") 
    JmsTemplate jmsTemplate; 

    @Around("execution(* onMessage(javax.jms.Message))") 
    public Object aroundOnMessage(ProceedingJoinPoint pjp) throws Throwable{ 
     StopWatch stopWatch = new StopWatch(); 
     stopWatch.start(); 
     Object retVal = pjp.proceed(); 
     stopWatch.stop(); 
     log.trace(pjp.getSignature().getName() + " Execution Time: " + stopWatch.getTotalTimeMillis()+" ms"); 
     return retVal; 
    } 
    @AfterReturning("execution(* onMessage(javax.jms.Message))") 
    public void afterOnMessage(){ 
     // logic to capture time 
     log.debug("*****************************EXIT ONMESSAGE*******************************"); 

    } 

    @Around("execution(* commit(..))") 
    public Object aroundCommit(ProceedingJoinPoint pjp) throws Throwable{ 
     try{ 
      return pjp.proceed(); 
     }catch(Throwable ex){ 
      log.error("Unexpected Error occured during database commit routing message to ErrorQ", ex); 
      jmsTemplate.convertAndSend(errorDestination, ex); 
      throw ex; 
     }finally{ 
      log.trace("Commiting Transaction..."); 
     } 

    } 
    @AfterThrowing(value="execution(* onMessage(javax.jms.Message) throws java.lang.RuntimeException)",throwing="ex") 
    public void afterThrowingOnMessage(JoinPoint jp,RuntimeException ex) throws RuntimeException{ 
     log.trace("Unexpected Error occured during onMessage processing routing to ErrorQ"); 
     log.error("{{ERROR}}", ex); 
     Object[] args = jp.getArgs(); 
     if (args!=null && args[0] instanceof javax.jms.Message){ 
      Message msg = (Message)args[0]; 
      jmsTemplate.convertAndSend(errorDestination, msg); 
      log.info("Unexpected Error occured successfully routed to ErrorQ"); 
     }else 
      log.info("Unexpected Error occured failed to route to ErrorQ"); 
    } 
} 
+0

आप किस सटीक वसंत संस्करण का उपयोग कर रहे हैं? – tstorms

+0

@ टस्टम्स 3.0.6.RELEASE – c12

+0

क्या आपने नवीनतम वसंत संस्करण का उपयोग करने पर विचार किया है? अभी यह 3.2.2 है। रिलीज। इस तरह, हम संभावित निश्चित बग को रद्द करते हैं। – tstorms

उत्तर

3

पर इन फ़ाइलों साथ AOP उपयोग कर रहे हैं ऐसा लगता है कि एनपीई फेंक दिया जाता है, क्योंकि कनेक्शन अशक्त (चर this.target) है।

कनेक्शन डेटास्रोत से प्राप्त किया जाता है से पहले कुछ पंक्तियां (LazyConnectionDataSourceProxy.java):

// Fetch physical Connection from DataSource. 
this.target = (this.username != null) ? getTargetDataSource().getConnection(this.username, this.password) : getTargetDataSource().getConnection(); 

Googling मैं ने पाया है कि Oracle JDBC ड्राइवर निम्नलिखित स्थिति में एक अशक्त कनेक्शन (link) वापस आ सकते हैं:

ConnectionWaitTimeout

कैश व्यवहार जब एक कनेक्शन अनुरोध किया जाता है निर्दिष्ट करता है और वहाँ हैं पहले से ही MaxLimit कनेक्शन सक्रिय है। यदि कनेक्शन WaitTimeout शून्य से अधिक है, तो प्रत्येक कनेक्शन अनुरोध निर्दिष्ट संख्या के सेकंड या कैश पर कनेक्शन लौटाए जाने तक प्रतीक्षा करता है। यदि टाइमआउट समाप्त होने से पहले कैश में कोई कनेक्शन वापस नहीं किया जाता है, तो कनेक्शन अनुरोध शून्य हो जाता है।

डिफ़ॉल्ट: 0 (कोई टाइमआउट)

तो, मुझे लगता है कि, एक कनेक्शन समयबाह्य अपने असंगत समस्या को समझा जा सके।

+0

मैं कनेक्शन आउटटाइमआउट को 30 सेकंड तक बढ़ाने की कोशिश करने जा रहा हूं, जब तक कि आपके पास टाइमआउट मान के लिए कोई और अनुशंसा न हो? मैं मैक्सलिमिट को 50 से 75 तक बढ़ा सकता हूं। – c12

+0

उन पैरामीटर को बदलने से टाइमआउट की संख्या कम होनी चाहिए, लेकिन आपको अभी भी अपने एप्लिकेशन कोड में अपवादों को संभालना चाहिए (उदाहरण के लिए, पुनः प्रयास करें, उपयोगकर्ता को संदेश दिखाएं ... आपके आवेदन पर निर्भर करता है) । –

+0

अपवाद को संभाला जाता है क्योंकि हम संदेश को एक त्रुटि कतार में डालते हैं जिसे फिर से पुन: संसाधित किया जा सकता है। – c12

1

आप अपने लेन-देन सही ढंग से लागू हो गया है?

क्या आप डेटा स्रोत के लिए conifg फ़ाइलें दिखा सकते हैं?

इसके अलावा यह चित्र देखो आप

myapp.api.listener.backoffice.StorableMessageListener.processNew(StorableMessageListener.java:136) 

myapp.api.listener.backoffice.StorableMessageListener.onMessage(StorableMessageListener.java:187) 
+0

का प्रयास करूंगा मैंने अपना स्प्रिंग कॉन्फ़िगरेशन पोस्ट किया है। यह वही विन्यास हमारे उत्पादन माहौल में पिछले साल काम कर रहा था और कॉन्फ़िगरेशन के संबंध में कुछ भी नहीं बदला है। यह नेटवर्क या डेटाबेस स्तर पर हो सकता है, लेकिन दुर्भाग्य से मैं उन क्षेत्रों में ज्यादा खोद नहीं सकता हूं। सक्रिय कनेक्शन को देखने के तरीके पर कोई विचार, शायद मैंने ग्लासफ़िश द्वारा अपनी अधिकतम अनुमति को मारा है। कोई विचार क्यों वसंत उस अपवाद को फेंक देगा? – c12

+0

StorableMessageListener में कोड क्या करता है? ऐसा लगता है कि कुछ एओपी के लिए फायरिंग धन्यवाद ... – NimChimpsky

+0

यह एक वसंत जेएमएस श्रोता है जो ओपनएमक्यू संदेश कतार से संदेशों को संसाधित कर रहा है और उन्हें ओरेकल डेटाबेस में संग्रहीत कर रहा है। – c12

संबंधित मुद्दे

 संबंधित मुद्दे