我有一個使節點之間關係的servlet,它在一個循環中這樣做,它可以在循環中創建一個或多個關係 。它通過從數組列表中加載數據到 Neo4j來實現。我第一次運行它時效果很好。第二次,如果我再運行5秒鐘,它會給出java.lang.NullPointerException
。大約一分鐘後,它再次運作良好。 這是servlet代碼Neo4j無法將事務標記爲僅回滾
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中改打中 一個空的換行輸入,它總是好的工作和保存,servlet重新加載 - 然後啓動Neo4j的其他方式,它給了例外。
你註釋掉了你得到graphDB實例的行,是有意的嗎? – 2013-05-12 08:49:54
是的,這是我認爲我可以使用靜態相同的效果 - 不要太複雜。會發生什麼情況是,當我運行代碼第一次它確實,第二次失敗,如果我等待2分鐘再次運行,它再次運作良好。如果我在代碼Netbeans中進行了一些更改,例如輸入空間進行保存,則Tomcat將重新加載它也運行的servlet。當它失敗我得到java.lang.NullPointerException和org.neo4j.graphdb.TransactionFailureException:無法將事務標記爲僅回滾 – 2013-05-12 11:53:07
而我使用jdk7 for java – 2013-05-12 12:10:51