0

ノード間の関係を作成するサーブレットがあります。これはループで行います。ループで 1 ~ 999 以上の関係を作成する場合があります。これは、データを配列リストから Neo4j にロードすることによって行われます。初めて実行すると、うまく機能します。2回目に5秒で実行すると、 java.lang.NullPointerException . 約 1 分後、再び正常に動作します。これはサーブレットのコードです

public class InputDebtDataToNeo4j extends HttpServlet {

static GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase("C:\\Users\\Jovo\\Documents\\NetBeansProjects\\DebtSolutions\\build\\web\\NEO4J databases\\db1"); 
//Neo4jSinletonDbStart nn=new Neo4jSinletonDbStart();
//GraphDatabaseService graphDB =nn.getInstance();
    private ArrayList<InputData> l111;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        HttpSession session=request.getSession(true); 

        l111= (ArrayList<InputData>) session.getAttribute("hasdata");
        long mynodenumber;
        mynodenumber = Long.parseLong(session.getAttribute("node_id").toString());
        Transaction tx = graphDB.beginTx();
        try {
            Node firstNode;
            Node secondNode;    
            for (InputData element : l111)
            {
                Relationship relationship = null;
                firstNode=graphDB.getNodeById(mynodenumber);
                secondNode=graphDB.getNodeById(element.getNodeidnumber());

                relationship = firstNode.createRelationshipTo( secondNode, RelTypes.OWES );
                relationship.setProperty( "amount", "'"+element.getDebtamount()+"'" );  

                out.println( relationship.getStartNode().toString());
                out.println( relationship.getProperty( "amount" ) );
                out.println( relationship.getEndNode().toString() );
           }

           tx.success();   
            //response.sendRedirect("DebtSolutions.jsp");
        } 
        catch(Exception e )
        {
             tx.failure();
             out.println(e.toString());
        }
        finally { 
            tx.finish();
            graphDB.shutdown();     
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

私が得るものは

org.neo4j.graphdb.TransactionFailureException: Failed to mark transaction as rollback only

私が気づいたのは、Netbeans で変更を加えたときに常に正常に動作することです。たとえば、空の改行を入力して保存すると、サーブレットがリロードされ、例外が発生する他の方法で Neo4j が開始されます。

4

2 に答える 2

1

つまり、このようなデータベースを作成およびシャットダウンするためのシングルトン クラスを作成する必要がありました。

public class GraphDbStarter {
    private static GraphDatabaseService graphdb=null;

    protected GraphDbStarter()
    {}

 //   static GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase("C:\\Users\\Jovo\\Documents\\NetBeansProjects\\DebtSolutions\\build\\web\\NEO4J databases\\db1"); 
   public static GraphDatabaseService getInstance()
   {
       if(graphdb == null) {
        graphdb = new GraphDatabaseFactory().newEmbeddedDatabase("C:\\Users\\Jovo\\Documents\\NetBeansProjects\\DebtSolutions\\build\\web\\NEO4J databases\\db1");
         registerShutdownHook(graphdb);  
       }

   return graphdb;
   }

   private static void registerShutdownHook(final GraphDatabaseService graphdb )
   {
   Runtime.getRuntime().addShutdownHook(new Thread()
   {    

       @Override
    public void run()
    {
    graphdb.shutdown();
    }
   });
   }
}

そして私のサーブレットの使用では

static GraphDatabaseService graphDB=GraphDbStarter.getInstance();

それなし

 graphdb.shutdown();

サーブレットで.これで正常に動作します...

于 2013-05-12T14:12:17.380 に答える