交易表现以及如何减轻交易经理?

时间:2012-10-16 11:42:23

标签: neo4j spring-data-neo4j

我正在使用没有AspectJ的SDN 2.1.0-RC4进行身份,访问和角色管理。 该系统旨在管理大约120,000个用户,并从传统和HR应用程序中提取数据。 我每天有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;

        /.../
}

我逐个插入数据

    /.../
/**
 * 
 */
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 ms,最小值为0,00 ms,最大值为3,00 ms

与本机neo4j服务器相比,JtaTransactionManager非常慢,但JtaTransactionManager是一个全球性且雄心勃勃的TransactionManager。

我的目的是如何减轻或创建一个野心较小,范围较小但仍使用@Transactional注释的自定义事务管理器?

可能是我错过了什么?

感谢您提供任何潜在的帮助或建议。

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

1 个答案:

答案 0 :(得分:2)

您使用两种完全不同的交易批量大小。

使用“neo4j”TM,您可以使用全局tx范围,一次性包含所有更新(也就是几百或几千个操作)。

使用@Transactional,您可以使用单个操作的tx范围。因此,事务的开销仅为每个操作添加一次。

因此,请尝试在loadAllData()周围添加@Transactional。

同样,为了获得更高的插入速度,请尝试使用template.createRelationshipBetween(...., duplicate=true)代替evt.setPrevious(curr)。因此,您跳过所有delta检测和重复消除。