我正在使用RDF数据库创建应用程序后端。
我使用Jena TDB作为后端。我得到了这个例外
com.hp.hpl.jena.sparql.JenaTransactionException: Currently in a transaction (location:/home/visittoravi/Documents/Store/DB/Tutor/)
这是我在此方法中的代码发生异常,我用comments-
标记了它public UserDetails loadUserByUsername(String email)
throws UsernameNotFoundException {
org.springframework.security.core.userdetails.User authUser = null;
logger.info("Getting user - " + email);
Dataset ds = datasetManager.getDs();
ds.begin(ReadWrite.READ); // Exception is being thrown here
try {
User user = logUserIn(email);
if (user == null) {
System.out.println("User not found");
throw new UsernameNotFoundException(email);
}
logger.info("role = " + user.getRole());
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority(user.getRole()));
authUser = new org.springframework.security.core.userdetails.User(
email, user.getPassword(), true, true, true, true,
authorities);
ds.commit();
} catch (Exception ex) {
ex.printStackTrace();
logger.error(ex);
ds.abort();
} finally {
ds.end();
}
return authUser;
}
datasetManager.getDs()方法 -
public Dataset getDs() {
if (ds == null) {
logger.log(Priority.INFO, "Creating TDB dataset at : " + dir);
ds = TDBFactory.createDataset(dir);
getOntModel();
}
return ds;
}
getOntModel()方法 -
public OntModel getOntModel() {
if (ontModel == null) {
Dataset ds = getDs();
ds.begin(ReadWrite.WRITE);
try {
ontModel = ModelFactory.createOntologyModel(
OntModelSpec.OWL_DL_MEM_RULE_INF, ds.getDefaultModel());
createAdminData(ds);
createAllOntClasses();
createAllProperties();
ds.commit();
} catch (Exception ex) {
ex.printStackTrace();
ds.abort();
} finally {
ds.end();
}
}
return ontModel;
}
createAdminData方法 -
private void createAdminData(Dataset ds) {
Resource admin = getDs().getDefaultModel().createResource(
rnamespace + "User1");
admin.addLiteral(VCARD.UID, 1l);
admin.addLiteral(VCARD.FN, "Admin");
admin.addLiteral(VCARD.NAME, "Admin");
admin.addLiteral(VCARD.EMAIL, "visittoravi@gmail.com");
admin.addLiteral(VCARD.ROLE, "ADMIN");
admin.addLiteral(VCARD.KEY, "password");
}
再次在createAllOntClasses()和createAllProperties()中;我正在使用ontModel创建一些ontclasses和属性。
正如你在getDs()方法中看到的,我已经创建了一个写事务,并且我还包括了结束事务(ds.end())。并且getOntModel()方法中的所有db写入部分都反映在数据库中我在fuseki中检查过它。之后我创建了一个读取事务并且它抛出了这个异常。
请帮助确定问题所在。此外,如果你有更好的方法来处理这样的场景,比如在spring mvc中的上下文启动时初始化db。