Hello Michael, Thanks for the guidance and advise regarding the JMX. It is really helpful to trace transactions related to neo4j.
Your assumption was correct. We have found 2 open transactions during start up of our web applications. We are using 1.9.8 Embedded Neo4j for Java EE application. Can you please advise any tools to find what place the open transaction occur.. We are forced to restart the application to close the open transaction. Is there any other way to close the open transaction in neo4j? With Regards, Kannan S C On Monday, 23 March 2015 23:06:18 UTC, Michael Hunger wrote: > > > > Von meinem iPhone gesendet > > Am 23.03.2015 um 23:44 schrieb S C Kannan <[email protected] > <javascript:>>: > > Hello Michael, > > can we use ONE instance of ExecutionEngine for all cipher Query Execution? > > > Yes > > Or we want to create separate Instance ExecutionEngine for each Cipher > query execution? > > > No > > Kindly advise.. > > With Regards, > Kannan S C > > On Sunday, 22 March 2015 08:41:24 UTC, Michael Hunger wrote: >> >> You create two instances of GraphDatabaseService? >> >> Also as you create connections to the root node you might get contention >> on that root node too. >> >> Please do create only ONE instance of ExecutionEngine and keep it with >> the GraphDatabaseService. >> >> I'd probably switch to an index based approach than a reference node >> based approach and use the NodeUniqueFactory with an index instead which is >> less lock sensitive. >> >> I can only recommed to you to trace your open transactions (e.g. via JMX >> and find the one that's still open e.g. for the root node). >> Those might be other transactions which are missing a tx.success() that >> lock the root node. >> >> Michael >> >> Am 22.03.2015 um 00:20 schrieb S C Kannan <[email protected]>: >> >> Hello Michael, >> >> Thanks for quick response. I have added the two class files below. >> (NeoUtil & DataSource) which are used in the code provided. >> >> Minimum Heap Size 128MB >> Maximum Heap Size 1024MB >> >> Yes we have hidden transaction there which was stated on NeoUtil class >> findParentNode method. If Parent Node Not available, the method will create >> the parent Node. We have stated the respective methods code in the Neo Util >> class. >> >> >> *NeoUtil Class* >> ============================== >> ===================================================================== >> public class NeoUtil { >> public static Node findParentNode(String nodeName) { >> String strCipherQuery = "START root=node(1) MATCH root" >> + "-[:TABLE]->tb " >> + " WHERE tb.name='" + nodeName + "' " >> + " RETURN tb"; >> try { >> >> Node node = executeCypherQuerySingleResult(strCipherQuery, >> "tb"); >> if (null != node) { >> return node; >> } else { >> createReferenceNode(nodeName); >> } >> >> } catch (Exception e) { >> e.printStackTrace(); >> log.warn("Exception while find Node using Name : " + nodeName >> + ".. Error is : " + e.getLocalizedMessage()); >> } >> return null; >> } >> >> public static Node executeCypherQuerySingleResult(String >> strCypherQuery, String strResultColumnName) { >> ExecutionResult result = null; >> ExecutionEngine engine = null; >> try { >> engine = new ExecutionEngine(DataSource.getGraphDBAPI(), >> StringLogger.SYSTEM); >> result = engine.execute(strCypherQuery); >> } catch (Exception e) { >> log.warn("Exception on Executing Cypher Query : " + >> strCypherQuery + ".. Error is : " + e.getLocalizedMessage()); >> } finally { >> engine = null; >> } >> return nodeFromResult(result, strResultColumnName); >> } >> >> public static Node nodeFromResult(ExecutionResult result, String >> column) { >> Iterator<Node> n_column; >> try { >> n_column = result.columnAs(column); >> Node node = null; >> while (n_column.hasNext()) { >> node = n_column.next(); >> return node; >> } >> return null; >> } catch (Exception e) { >> return null; >> } finally { >> n_column = null; >> } >> } >> >> public static Node createReferenceNode(String refNode) { >> log.info("refNode : " + refNode); >> Transaction tx = DataSource.getGraphDBAPI().beginTx(); >> >> try { >> //Get the root Node >> Node rootNode = executeCypherQuerySingleResult("start >> rt=node(1) return rt", "rt"); >> >> //Create the new node >> Node neoNode = DataSource.getGraphDB().createNode(); >> //Set the name for that node >> neoNode.setProperty("name", refNode); >> >> //relate the new node to the parent node >> rootNode.createRelationshipTo(neoNode, TABLE); >> tx.success(); >> } catch (Exception e) { >> tx.failure(); >> log.warn("Exception on Creating Reference Node." + ".. Error >> is : " + e.getLocalizedMessage()); >> } finally { >> tx.finish(); >> } >> } >> } >> >> =============================================================================================== >> *DataSource Class* >> >> =============================================================================================== >> public class DataSource { >> >> static GraphDatabaseService graphDb = null; >> >> public static GraphDatabaseService getGraphDBAPI() { >> >> return graphDb; >> } >> >> public static GraphDatabaseService dbStart() { >> String glassfishInstanceRootPropertyName = >> "com.sun.aas.instanceRoot"; >> String serverLocation = >> System.getProperty(glassfishInstanceRootPropertyName) ; >> String fileName = serverLocation + "/config/neoDb.conf"; >> >> log.info("Database Config File Path : " + fileName); >> Properties prop = new Properties(); >> try { >> // the configuration file name >> InputStream is = new FileInputStream(fileName); >> >> // load the properties file >> prop.load(is); >> } catch (IOException e) { >> log.warn("Exception With Db Setup : " + >> e.getLocalizedMessage()); >> } >> DB_PATH = prop.getProperty("graphdb.location"); >> DB_EMBED_PORT = prop.getProperty("graphdb.port"); >> SERVER_HOSTNAME = prop.getProperty("graphdb.server.hostname"); >> UPLOAD_FILE_LOC = serverLocation + prop.getProperty("upload.dir"); >> >> DB_TUNE_FILE = serverLocation+"/config/neo4j.properties"; >> >> log.info("Properties File : " + DB_PATH); >> >> // Create Database with Properties >> GraphDatabaseAPI graphdb = (GraphDatabaseAPI) new >> GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH). >> setConfig(GraphDatabaseSettings.node_keys_indexable, >> prop.getProperty("node_keys_indexable")). >> setConfig(GraphDatabaseSettings.node_auto_indexing, >> prop.getProperty("node_auto_indexing")). >> setConfig(GraphDatabaseSettings.cache_type, >> prop.getProperty("cache_type")). >> setConfig(GraphDatabaseSettings.allow_store_upgrade, >> prop.getProperty("allow_store_upgrade")). >> >> setConfig(GraphDatabaseSettings.nodestore_propertystore_mapped_memory_size, >> prop.getProperty("nodestore_propertystore_mapped_memory_size")). >> >> setConfig(GraphDatabaseSettings.nodestore_mapped_memory_size, >> prop.getProperty("nodestore_mapped_memory_size")). >> >> setConfig(GraphDatabaseSettings.relationshipstore_mapped_memory_size, >> prop.getProperty("relationshipstore_mapped_memory_size")). >> >> setConfig(GraphDatabaseSettings.strings_mapped_memory_size, >> prop.getProperty("strings_mapped_memory_size")). >> >> setConfig(GraphDatabaseSettings.use_memory_mapped_buffers, >> prop.getProperty("use_memory_mapped_buffers")). >> >> setConfig(GraphDatabaseSettings.relationship_auto_indexing, >> prop.getProperty("relationship_auto_indexing")). >> newGraphDatabase(); >> >> >> GraphDatabaseFactory().newEmbeddedDatabaseBuilder(DB_PATH).setConfig(ShellSettings.remote_shell_enabled, >> >> GraphDatabaseSetting.TRUE).newGraphDatabase(); >> >> // Server Configuration >> ServerConfigurator config; >> config = new ServerConfigurator(graphdb); >> >> config.configuration().setProperty(Configurator.WEBSERVER_PORT_PROPERTY_KEY, >> DB_EMBED_PORT); >> >> config.configuration().setProperty(Configurator.DB_TUNING_PROPERTY_FILE_KEY, >> DB_TUNE_FILE); >> >> config.configuration().setProperty(Configurator.WEBSERVER_ADDRESS_PROPERTY_KEY, >> >> SERVER_HOSTNAME); >> >> try { >> srv = new WrappingNeoServerBootstrapper(graphdb, config); >> srv.start(); >> } catch (Exception e) { >> log.warn("DS Error : " + e.getLocalizedMessage()); >> e.printStackTrace(); >> } >> >> graphDb = graphdb; >> registerShutdownHook(graphDb); >> return graphDb; >> } >> >> private static void registerShutdownHook(final GraphDatabaseService >> graphDb) { >> Runtime.getRuntime().addShutdownHook(new Thread() { >> >> @Override >> public void run() { >> graphDb.shutdown(); >> srv.stop(); >> } >> }); >> } >> } >> >> >> ====================================================================================================== >> >> The Node find Query(Point 7) was done on console. Not from Source. >> >> Best Regards, >> Kannan S C >> >> >> On Saturday, 21 March 2015 20:20:59 UTC, Michael Hunger wrote: >>> >>> In principle your code looks ok, >>> >>> It's not clear which code/database your neoUtil.findParentNode("Test"); >>> uses >>> and what DataSource.getGraphDBAPI() does >>> >>> how much heap do you provide to your application? >>> >>> >>> Am 21.03.2015 um 20:04 schrieb S C Kannan <[email protected]>: >>> >>> Hi Michael, >>> >>> Thanks for the response. I have added the exact fail case scenario with >>> codes and configuration as follows, >>> >>> We are using single threaded only. >>> >>> I am using Neo4j 1.9.8 Embedded Database. The steps used to create node >>> are as follows, >>> >>> 1. Start the Transaction >>> 2. Create the Node. >>> 3. Set few properties to the node >>> 4. Create two relationships with other nodes >>> >>> I see only one relationship-creation in your code >>> >>> 5. Commit the transaction >>> 6. Print the Node Id (eg. 13456) >>> >>> where is that? >>> >>> 7. Fetch the particular Node with the Node Id above with following >>> query. START root=node(13456) RETURN root;But the following error throws >>> >>> I think somehow you either leak transactions so you still have a write >>> lock at the node(s) (probably the parent-node) which is not unlocked yet >>> and your second tx hangs on the same lock. >>> Do you have outer transactions that you don't show here? >>> >>> >>> EntityNotFoundException: Node 13456 not found >>> >>> When I try to do the above transaction again, the program hangs at point >>> no 4. >>> >>> The Java Class used to create node with property and relation ship are >>> as follows, >>> >>> Transaction trx = DataSource.getGraphDBAPI().beginTx(); >>> try{ >>> Node ndeTest= DataSource.getGraphDB().createNode(); >>> ndeTest.setId("1"); >>> ndeTest.setName("Test API"); >>> ndeTest.setURL("www.test.com"); >>> Node parentNode = neoUtil.findParentNode("Test"); >>> parentNode.createRelationshipTo(ndeTest, >>> KnoxxiRelationshipType.API); >>> ndeTest.setStatus("1"); >>> trx.success(); >>> }catch (Exception e) { >>> trx.failure(); >>> log.error("Test Node Creation Failed," + e.getLocalizedMessage); >>> } finally {trx.finish();} >>> log.info("Node Id : "+ ndeTest.getId()); >>> >>> The neo4j Configuration are as follows: >>> >>> node_auto_indexing=true >>> cache_type=gcr >>> nodestore_propertystore_mapped_memory_size=150M >>> nodestore_mapped_memory_size=100M >>> relationshipstore_mapped_memory_size=500M >>> strings_mapped_memory_size=150M >>> relationship_auto_indexing=true >>> >>> The last few lines on neo4j message.log file are as follows: >>> >>> >>> 2015-03-20 09:25:08.030+0000 INFO [o.n.k.EmbeddedGraphDatabase]: GC >>> Monitor: Application threads blocked for an additional 385ms [total block >>> time: 5.365s] >>> 2015-03-20 09:25:25.766+0000 INFO [o.n.k.EmbeddedGraphDatabase]: GC >>> Monitor: Application threads blocked for an additional 395ms [total block >>> time: 5.76s] >>> >>> Please guide me if i miss something out. >>> >>> Best Regards, >>> Kannan S C >>> >>> On Friday, 20 March 2015 10:27:14 UTC, Michael Hunger wrote: >>>> >>>> Please share you code, best a failing test, neo4j version, data model. >>>> Are you running single threaded or multi threaded, ... >>>> >>>> M >>>> >>>> Am 20.03.2015 um 11:12 schrieb S C Kannan <[email protected]>: >>>> >>>> Hi Experts, >>>> >>>> I am facing an issue which was stated as follows, >>>> >>>> 1. I can able to use cipher query to fetch records. But when i save a >>>> new node and Create relationship to the someother node, Neo4j hangs and >>>> nothing happens after that. There are no error logs on Message.log. >>>> >>>> Please help to sort this out' >>>> >>>> With Regards, >>>> Kannan S C >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Neo4j" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Neo4j" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >>> >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "Neo4j" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- > You received this message because you are subscribed to the Google Groups > "Neo4j" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] <javascript:>. > For more options, visit https://groups.google.com/d/optout. > > -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
