我正在使用没有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
答案 0 :(得分:2)
您使用两种完全不同的交易批量大小。
使用“neo4j”TM,您可以使用全局tx范围,一次性包含所有更新(也就是几百或几千个操作)。
使用@Transactional
,您可以使用单个操作的tx范围。因此,事务的开销仅为每个操作添加一次。
因此,请尝试在loadAllData()
周围添加@Transactional。
同样,为了获得更高的插入速度,请尝试使用template.createRelationshipBetween(...., duplicate=true)
代替evt.setPrevious(curr)
。因此,您跳过所有delta检测和重复消除。