2012-04-22 3 views
3

Ehcache 2.4.3과 함께 최대 절전 모드 4.1.2를 사용했습니다 (최대 절전 모드가 해제 될 때 최대 절전 모드와 함께 제공됨).java.lang.NullPointerException Ehcache와 함께 사용되는 최대 절전 모드

내있는 hibernate.cfg.xml :

<?xml version='1.0' encoding='utf-8'?> 
    <!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
      <property name="hibernate.connection.driver_class"> com.microsoft.sqlserver.jdbc.SQLServerDriver </property> 
      <property name="hibernate.connection.url"> jdbc:sqlserver://localhost:1433;databaseName=Stock_indices</property> 
      <property name="hibernate.connection.username">xxx</property> 
      <property name="hibernate.connection.password">xxx</property> 
      <property name="hibernate.show_sql">true</property> 
      <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> 
      <property name="hibernate.hbm2ddl.auto">update</property> 
      <property name="hibernate.c3p0.min_size">5</property> 
      <property name="hibernate.c3p0.max_size">20</property> 
      <property name="hibernate.c3p0.timeout">300</property> 
      <property name="hibernate.c3p0.max_statements">50</property> 
      <property name="hibernate.c3p0.idle_test_period">30</property> 


      <property name="hibernate.cache.use_second_level_cache">true</property> 
      <property name="hibernate.cache.use_query_cache">true</property> 
      <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory    </property> 
      <property name="net.sf.ehcache.configurationResourceName">ehcache-entity.xml</property> 

      <mapping resource="mapping.xml"/> 

     </session-factory> 
</hibernate-configuration> 

으로 Ehcache-entity.xml :

<?xml version="1.0"?> 
    <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

     <hibernate-mapping package="stockdata"> 

      <class name="StockDatabaseConnection" table="STOCKINDEX"> 

       <cache usage="read-only" /> 
        <composite-id name="CompositeIDConnection"> 
      <key-property name="ticker" column="TICKER"/> 
      <key-property name="indexdate" column="INDEXDATE"/> 
      </composite-id> 

        <property name="openprice"> <column name="OPENPRICE" /> </property> 
        <property name="closingprice"> <column name="CLOSEPRICE" /> </property> 
        <property name="highestprice"> <column name="HIGHPRICE" /> </property> 
        <property name="lowestprice"> <column name="LOWPRICE" /> </property> 
        <property name="volume"> <column name="VOLUME" /> </property> 


      </class> 
    </hibernate-mapping> 

는 그러나, 나는이 예외를 가지고

<?xml version="1.0" encoding="UTF-8"?> 
    <ehcache> 

     <cache name="stockdata.StockDatabaseConnection" eternal="false" 
     maxElementsInMemory="5" overflowToDisk="true" diskPersistent="false" 
     timeToIdleSeconds="0" timeToLiveSeconds="300" 
     memoryStoreEvictionPolicy="LRU" /> 

    </ehcache> 

mapping.xml :

 java.lang.NullPointerException at org.hibernate.cache.ehcache.internal.util.HibernateUtil.loadAndCorrectConfiguration(HibernateUtil.java:64) 
    at org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory.start(SingletonEhCacheRegionFactory.java:91) 
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:281) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1741) 
      ............ 

최대 절전 모드로 구성을로드 할 수없는 것 같습니다. 문제를 어떻게 해결할 수 있습니까? (serlvet 잘 Ehcache를 사용하지 않고 작동).

내 서블릿 클래스 :

package stockdataservlet; 

import java.io.IOException; 
import java.math.BigDecimal; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 
import org.hibernate.service.ServiceRegistryBuilder; 

import com.google.gson.Gson; 
import com.microsoft.sqlserver.jdbc.*; 


public class DataServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    public static SessionFactory sessionfactory = null; 
    public void init() { 
     try { 
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      Configuration conf = new Configuration(); 
      conf.configure(); 
      ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry(); 
      sessionfactory = conf.buildSessionFactory(serviceRegistry); 

       } 
     catch(Exception e){ 

     e.printStackTrace(); 
       } 
       } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
      Session session = null; 
     try{ 
      session = sessionfactory.openSession(); 
      Transaction transaction = session.beginTransaction(); 
      Query query = session.createSQLQuery("SELECT * FROM STOCKINDEX WHERE TICKER = :index ").addScalar("CLOSEPRICE"); 
      query.setParameter("index", "AAA"); 
      List list = query.list(); 
      transaction.commit(); 
      String json = new Gson().toJson(list); 
      /*response.setContentType("application/json"); 
      response.setCharacterEncoding("UTF-8"); 
      response.getWriter().write(json);*/ 
     } 
     catch(Exception e){ 
     e.printStackTrace(); 

     } 
     finally{ 

     session.close(); 
     }  
} 

은} enter image description here

+0

Hibernate 구성을 실제로 초기화하는 코드 또는 구성을 게시하십시오. – yair

+0

@yair : 이미 내 질문을 편집했습니다. –

+1

이것이 널 포인터의 원인이되는 코드라고 가정합니다. 구성 config = ConfigurationFactory.parseConfiguration (url); if (config.getDefaultCacheConfiguration() .TerracottaClustered()) 정확히 어디에 ehcache-entity.xml이 배치되어 있는지 게시하지 않았습니다. 클래스 패스에서 찾을 수 없다고 생각합니다. – vinodn

답변

1

괜찮습니다. 리소스 이름이 ehcache.xml이고 클래스 경로에 배치 된 경우 "net.sf.ehcache.configurationResourceName"속성에 값을 명시 적으로 지정할 필요가 없습니다. 여러 캐시 관리자가있는 경우이 옵션을 선택할 수 있습니다.

또는 lib의 모든 리소스 파일을 WEB-INF/resources와 같은 디렉토리로 옮길 수 있으므로 classpath에서 참조하는 것이 더 쉬워집니다.

Ehcache는 클래스 경로의 최상위 레벨에서 ehcache.xml 파일을 찾습니다. 실패하면 클래스 경로에서 ehcache-failsafe.xml을 찾습니다. ehcache-failsafe.xml은 Ehcache jar에 패키지되어 있으며 항상 발견되어야합니다.

+0

이것은 굉장했습니다. –

3

마지막으로 내 코드가 작동하지 않은 이유를 발견했다. Vinodn에게 제안 해 주셔서 감사합니다.

config.getDefaultCacheConfiguration().isTerracottaClustered() 

사실, 난 그 결과

config.getDefaultCacheConfiguration() 

는 null로, 나의으로 Ehcache-entity.xml에서 defaultCache 태그를 구성하지 않았다. 따라서 defaultCache을 추가하면 문제가 해결됩니다.

+0

나는 더 사용자 친화적 인 예외가 있어야한다고 가정합니다. –

+0

@ctapobep : 당신이 의미하는 것이 확실하지 않습니다. ( –

+1

NPE를 던지는 대신 IvalidConfigurationException 또는 smthng가 필요합니다. –

2

최대 절전 모드 구성으로로드 할 클래스 경로에 ehcache-entity.xml을 입력하십시오.

1

ehcache.xml의 defaultCache 구성을 추가하면 도움이됩니다.