1

私の Web サービスは jersy (安らかな Java) で作成されており、mysql データベースとの通信に Hibernate を使用しています。

日中は負荷テストやその他の機能テストを実行し、すべてが機能し、夕方の午後 5 時頃に仕事を離れます。翌朝、Tomcat を再起動すると、http 500 例外を介して Web サービスを再度テストします。それがホストされている場所で、ソースコードや休止状態の構成ファイルを変更せずに Web サービスを再開します。

正常に動作している他のWebサービスで使用されているのと同じHibernate構成ファイルを使用しています

ここに私の休止状態の構成ファイルがあります:

    <?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/offerstest</property> 
<property name="hibernate.connection.username">root</property> 
<property name="show_sql">true</property> 
<property name="connection.password">password</property> 
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property> 
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hbm2ddl.auto">update</property>
<property name="dynamic-update">true</property>
<mapping resource="person.hbm.xml"/>
<mapping resource="vendor.hbm.xml"/>
<mapping resource="coupons.hbm.xml"/>
<mapping resource="binding.hbm.xml"/>
</session-factory> 
</hibernate-configuration>

これは、Http 500 エラーが発生する Web サービス クラスです。

   @Path("/offers")
public class VendorOffers {

    VendorCRUD vendorCRUD;
    BindingCRUD bindingCRUD;

    public VendorOffers() {
        // TODO Auto-generated constructor stub
    }

    @PostConstruct
    public void init() {
        vendorCRUD = CommunicationSingleton.getInstance().getVendorCRUD();
        bindingCRUD = CommunicationSingleton.getInstance().getBindingCRUD();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    // @Produces(MediaType.APPLICATION_XML)
    @Path("{mac}/coupons")
    public Response getOffers(@PathParam("mac") String mac) {

        List<Offer> list = new ArrayList<Offer>();
        // get all the offers (Bindings) for the given mac
        List<Binding> bindings = bindingCRUD.getMACOffers(mac);
        if (bindings != null) {

            for (Binding binding : bindings) {
                Offer offer = new Offer();

                offer.setCoupon_no(binding.getCoupon_no());
                offer.setMac(binding.getMac());
                offer.setStartDate(binding.getStartdate());
                offer.setEndDate(binding.getEnddate());
                long vendorid = binding.getVendor_coupon_id();
                Vendor vendor = new Vendor();

                vendor.setApk("/rest/downloadfile/" + vendorid + "/getapk");// from
                                                                            // service
                vendor.setArtwork1("/rest/downloadfile/" + vendorid
                        + "/getArt1");// from service
                vendor.setArtwork2("/rest/downloadfile/" + vendorid
                        + "/getArt2");// from service
                vendor.setIcon("/rest/downloadfile/" + vendorid + "/getIco");// from
                                                                                // service
                vendor.setRedeem_doc("/rest/downloadfile/" + vendorid
                        + "/getHtm");// from service




                com.learning.CRUDModel.Vendor localvendor = vendorCRUD
                        .getVendorById(vendorid);

                System.out.println("localvendor.getCountry()"+localvendor.getCountry());
                vendor.setCountry(localvendor.getCountry()); // from database
                vendor.setDescription(localvendor.getDescription());// from
                                                                    // database
                vendor.setHeading(localvendor.getHeading());// from database
                vendor.setName(localvendor.getName());// from database
                vendor.setPkg_name(localvendor.getPkg_name());// from database
                vendor.setVendor_coupon_id(vendorid);// from database
                offer.setVendor(vendor);
                list.add(offer);
            }

            GenericEntity<List<Offer>> entity = new GenericEntity<List<Offer>>(list) {};
            Response response = Response.ok(entity).build();
            return response;
        } else {
            Response response = Response.noContent().build();
            return response;
        }

    }
}

生成されるエラーは次のとおりです。

    Aug 22, 2013 10:07:02 AM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NullPointerException
    at com.avilyne.rest.resource.VendorOffers.getOffers(VendorOffers.java:71)
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

行番号 71 に次のように書かれています。

com.learning.CRUDModel.Vendor localvendor = vendorCRUD
                        .getVendorById(vendorid);

vendorCRUD クラスは次のとおりです。

public class VendorCRUD {
    Session session = HibernateUtil.getSession();

    public String getVendorApk(String vendor_id){
        long id = 0;
        try {
            id = Long.parseLong(vendor_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String apk_path = "not available";

        System.out.println("Vendor Id Value:" + vendor_id);
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id",id);
            List <Vendor>list = query.list();
            if (list.size() > 0) {

                apk_path = list.get(0).getApk();

            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }

        return apk_path;
    }

    public String getVendorgetArt1(String vendor_id){
        long id = 0;
        try {
            id = Long.parseLong(vendor_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String art1_path = "not available";
        System.out.println("Vendor Id Value:" + vendor_id);
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id", id);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                art1_path = list.get(0).getArtwork1();
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }


        return art1_path;
    }


    public String getVendorgetArt2(String vendor_id){
        long id = 0;
        try {
            id = Long.parseLong(vendor_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String art1_path = "not available";
        System.out.println("Vendor Id Value:" + id);
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id", id);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                art1_path = list.get(0).getArtwork2();
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }
        return art1_path;
    }

    public String getVendorgetIco(String vendor_id){
        long id = 0;
        try {
            id = Long.parseLong(vendor_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String ico_path = "not available";
        System.out.println("Vendor Id Value:" + vendor_id);
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id", id);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                ico_path = list.get(0).getIco();
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }
        return ico_path;
    }

    public String getVendorgetHtm(String vendor_id){
        long id = 0;
        try {
            id = Long.parseLong(vendor_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String htm_path = "not available";
        System.out.println("Vendor Id Value:" + vendor_id);
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id", id);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                htm_path = list.get(0).getRedeem_doc();
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }
        return htm_path;
    }

    public List<Vendor> getVendorsForCountry(String country){
        List<Vendor> vendors = null;
        try {
            Query query = session.createQuery("from Vendor where Country = :Country ");
            query.setParameter("Country", country);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                vendors = list;
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        }catch(Exception ex){
            ex.printStackTrace();
        }

        return vendors;     
    }

    public Vendor getVendorById(long vendorid) {
        Vendor uniquevendor = null;
        try {
            Query query = session.createQuery("from Vendor where Vendor_Coupon_id = :Vendor_Coupon_id ");
            query.setParameter("Vendor_Coupon_id", vendorid);
            List <Vendor>list = query.list();
            if (list.size() > 0) {
                uniquevendor = list.get(0);
            }
        } catch (HibernateException ex) {
            ex.printStackTrace();
        } catch(Exception ex){
            ex.printStackTrace();
        }
        return uniquevendor;
    }

}
4

1 に答える 1

1

この行が NPE をスローしている場合:

    com.learning.CRUDModel.Vendor localvendor = vendorCRUD
                    .getVendorById(vendorid);

それは一つのこと、一つのことだけを意味します。の値はvendorCrudnullNPE がスローされたときです。

それがどのように起こったかを言うことはできません。ただし、それvendorCrudは変更可能であり、クラスと同じパッケージ内の任意のクラスからアクセスできることに注意してくださいVendorOffersそのため、それを変更できる通常の Java コードが多数存在する可能性があります。その場合、何かがメソッドを呼び出している可能性がありinit()ます...


フォローアップのコメントに基づいて、スタック内の何かが期限切れの MySQL 接続を処理していないことが推測されます。デフォルトでは、MySQL は長時間アイドル状態だった接続を切断します (デフォルトは 10 時間だと思います)。これに対処する 1 つの方法は、タイムアウトを非常に大きな値に変更することです。これには、データベース側の構成パラメーターがあります。ただし、これが参照になる方法/理由を理解し、それVendorCRUDを修正することをお勧めします。

ここで重要なのは Java プログラミングとデバッグのスキルを問題に適用して、何が起こっているのかを理解する必要があるということです。

于 2013-08-23T04:54:27.113 に答える