Я пытаюсь разобрать вставку CSV в базу данных графиков в OrientDB 3.0.6.
Файл CSV содержит 25000 документов с некоторыми атрибутами.
Когда я пытаюсь запустить анализатор, я получаю эту ошибку:
com.orientechnologies.orient.core.exception.ODatabaseException: Cannot execute the request because an asynchronous operation is in progress. Please use a different connection
DB name="sadosky"
at com.orientechnologies.orient.client.remote.OStorageRemote.baseNetworkOperation(OStorageRemote.java:249)
at com.orientechnologies.orient.client.remote.OStorageRemote.networkOperationRetryTimeout(OStorageRemote.java:214)
at com.orientechnologies.orient.client.remote.OStorageRemote.networkOperation(OStorageRemote.java:243)
Это скрипт, который загружает часть данных.
private void parseEtiquetas() {
try {
ClassLoader classLoader = getClass().getClassLoader();
CSVReader reader = new CSVReader(new FileReader(classLoader.getResource("CETA/CETA_set_de_entrenamiento.csv").getFile()));
reader.skip(1);
String[] docLine;
int i = 0;
Transaction t = sm.getCurrentTransaction();
System.out.println("Leyendo los datos y calculando los TF...");
while ((docLine = reader.readNext()) != null) {
i++;
System.out.println(""+i+"-------------------------------------------------");
System.out.println(" Doc: "+docLine[ID_NORMA]);
// procesar el documento para todas las etiquetas
// System.out.println("" + docsSize + " " + nextLine[ID_NORMA] + " " + nextLine.length);
Documento doc = getDocumento(docLine[ID_NORMA], t);
if (doc != null) {
System.out.println("Etiquetas: " + docLine[ETIQUETAS]);
String[] etiquetas = docLine[ETIQUETAS].split(",");
for (String etiqueta : etiquetas) {
etiqueta = etiqueta.trim();
System.out.println("--->"+etiqueta+"<");
// verificar si existe en la base
Etiqueta e = getEtiqueta(etiqueta, t);
if (e == null) {
System.out.println("Etiqueta nueva: " + etiqueta);
Etiqueta et = new Etiqueta(etiqueta);
e = t.store(et);
} else {
System.out.println("etiqueta.size: "+(e.getDocs()!=null?e.getDocs().size():0));
}
e.addDoc(doc);
t.commit();
}
} else {
System.out.println("ERROR AL PROCESAR ID_NORMA: " + docLine[ID_NORMA]+". EL DOC NO EXISTE!!!");
}
System.out.println("cerrado trasacción...");
System.out.println("cerrada.");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private Documento getDocumento(String docId, Transaction t) {
Documento ret = null;
List<Documento> ld = t.query(Documento.class, "select from Documento where id_doc = ?", new Object[]{docId});
if (ld.size() > 0) {
ret = ld.get(0);
}
return ret;
}
SessionManager (sm) - это класс, который связывает соединение с базой данных. Параметр таков:
sm = new SessionManager("remote:127.0.0.1/sadosky", "root", "toor", 100, 1000)
.setActivationStrategy(SessionManager.ActivationStrategy.CLASS_INSTRUMENTATION, true);
Я не смог найти, что не так в Orient 3. Ошибка с этой ошибкой после импорта 15 записей. Всегда 15 записей, но не сбой в одной и той же точке. Иногда, если в коммите происходит сбой, иногда в запросе происходит сбой. Это не ясно, и я не мог отследить это.
Этот код отлично работает с OrientDB 2.2.29.
Похоже, что-то с транзакцией OrientGraph.
Класс Transaction обрабатывает соединение с базой данных и выполняет другие действия. Это соответствующая часть:
OrientGraph orientdbTransact;
/**
* Devuelve una transacción ya inicializada contra la base de datos.
*
* @param sm
*/
Transaction(SessionManager sm) {
this.sm = sm;
orientdbTransact = this.sm.getFactory().getTx();
this.objectMapper = this.sm.getObjectMapper();
}
...
}