0

私は、AspectJを使用せずにSDN 2.1.0-RC4を使用して、ID、アクセス、および役割の管理に取り組んでいます。このシステムは約12万人のユーザーを管理することを目的としており、データはレガシーアプリケーションとHRアプリケーションから抽出されます。私は1日あたり500から30000の更新があるので、パフォーマンスは厄介な問題になる可能性があります。デフォルト構成でいくつかのワークベンチを実行しました。

私は非常に単純で愚かな方法を使用しました。簡単なクラス

@TypeAlias("event")
@NodeEntity
public class Event {

    @GraphId
    private Long graphId;

    @Indexed
    private Long eventId;

    @RelatedTo(type="PREVIOUS_EVENT", direction=Direction.OUTGOING)
    private Event previous;

    private String description;

        /.../
}

データを1つずつ挿入します

    /.../
/**
 * 
 */
public void loadAllData() {

    Event root = new Event();
    root.setEventId(0L);
    root.setDescription("ROOT");

    repository.save(root);
    Event curr = root;


    for(int i = 0; i< SIZE; i ++) {
        curr = insertData(curr, i );
    }
}


/**
 * @param curr
 * @param i
 * @return
 */
public Event insertData(Event curr, int i) {
    long lastTime = System.currentTimeMillis();
    Event evt = new Event();
    evt.setEventId(curr.getEventId()+1);
    evt.setPrevious(curr);
    evt.setDescription("event #"+i);
    repository.save(evt);
    curr = evt;
    delais[i] = System.currentTimeMillis() - lastTime;
    return curr;

}
/.../

これらのメソッドをオーバーロードしていくつかテストします

1)@Transactionalの使用

@Override
@Transactional
public Event insertData(Event curr, int i) {
    return super.insertData(curr, i);
}

2)neo4jトランザクションの使用

@Override
public void loadAllData() {
    gds = getContext().getBean(GraphDatabaseService.class);
    super.loadAllData();
}       

@Override
public Event insertData(Event curr, int i) {                
    Transaction tx = gds.beginTx();
    try {
        curr = super.insertData(curr, i);
        tx.success();
    } catch(Exception e) {
        tx.failure();
    } finally {
        tx.finish();
    }
    return curr;

}

私はベンチマークがトローリングの主題であることを知っています、そしてそれは私が望むものではありません。したがって、これらの値をそのまま使用します。愚かなテスト

結果

JtaTransactionManager

平均47,20ミリ秒、最小21,00ミリ秒、最大425,00ミリ秒

GraphDatabaseService

平均0.90ミリ秒、最小0.00ミリ秒、最大3,00ミリ秒

JtaTransactionManagerはネイティブneo4jサーバーに比べて非常に低速ですが、JtaTransactionManagerはグローバルで野心的なTransactionManagerです。

私の目的は、野心が少なく、スコープが小さいが、@ Transactionalアノテーションを使用してカスタムtransactionManagerを軽量化または作成する方法ですか?

私は何かを逃したかもしれませんか?

潜在的な助けやアドバイスをありがとう。

PS:私の構成

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:annotation-config/>
    <context:spring-configured/>

    <context:component-scan base-package="benchmark"/>

    <neo4j:repositories base-package="benchmark.repository"/>
    <neo4j:config graphDatabaseService="graphDatabaseService"/>


    <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase" 
      destroy-method="shutdown">
         <constructor-arg index="0" value="data/benchmark.db" />
    </bean>


</beans>

Marc DeXeT

4

1 に答える 1

2

2つのまったく異なるトランザクションバッチサイズを使用します。

「neo4j」TMでは、すべての更新を一度に含むグローバルtxスコープを使用します(別名、数百または数千の操作)。

これにより@Transactional、単一操作のtxスコープが得られます。したがって、トランザクションのオーバーヘッドは、1回だけではなく、操作ごとに追加されます。

loadAllData()したがって、代わりに@Transactionalを配置してみてください。

また、挿入速度を上げるには、template.createRelationshipBetween(...., duplicate=true)の代わりにを使用してみてくださいevt.setPrevious(curr)。したがって、すべてのデルタ検出と重複除去をスキップします。

于 2012-10-22T15:16:59.283 に答える