Search the FirstSpirit Knowledge Base
Hallo,
ich möchte aus einem Skript (bzw. später aus einem Modul) in einer Schleife viele Datensätze in einem Rutsch erzeugen. Dazu habe ich mich an Datenquellen-Eintrag via Script – keine Reaktion gehalten und das folgende Skript erstellt:
void storeEntity(Project project, Content2 content2, Entity entity) {
content2.setLock(true, false);
try {
ds = content2.getDataset(entity);
formData = ds.getFormData();
for (lang: project.getLanguages()) {
field = formData.get(lang, "tt_name");
field.set("hello world!");
context.logInfo("setting field for lang: " + lang);
}
ds.setFormData(formData);
context.logInfo("formdata set");
content2.save();
} finally {
content2.setLock(false, false);
}
}
dataSource = "myDatasource";
userService = context.getUserService();
project = userService.getProject();
contentStore = userService.getStore(Store.Type.CONTENTSTORE, false);
content2 = contentStore.getContent2ByName(dataSource);
schema = content2.getSchema();
session = schema.getSession();
for(int i=0; i<3; i++) {
try {
Entity entity = session.createEntity(content2.getEntityType().getName());
context.logInfo("entity created");
content2.lock(entity);
try {
storeEntity(project, content2, entity);
} finally {
content2.unlock(entity);
}
} catch (Exception ex) {
context.logError("some error happened", ex);
}
}
session.commit();
Leider funktioniert der Code unter FS5beta31 nicht zuverlässig, oft werden nicht in jedem Durchlauf Datensätze erzeugt, nach mehreren Ausführungen friert der JavaClient ein. Wie ist denn die korrekte Reihenfolge der createEntity(), lock(), setLock(), save() und commit()-Aufrufe? Und muss ich die Datenquelle für jeden Eintrag neu locken (oder gar committen)?
Hallo Martin,
folgende Beispielklasse erzeugt auf 2 verschiedene Weisen Datensätze und setzt ihre Werte. Es wurde die Datenquelle pressreleases aus dem Mithras Energy Projekt genommen. Sie erzeugt die Datensätze, gibt sie allerdings nicht frei. Dies tut man am besten hinterher manuell (Hierbei muss man dann natürlich auf die Befüllung aller Pflichtfelder achten). Die nicht einkommentierte Variante setzt die Werte über das FormData-Objekt. Commited werden sollte in regelmäßigen Abständen, da sonst der Speicher vollläuft. Aber auch nicht nach jedem, das macht sich laufzeittechnisch negativ bemerkbar.
public class DatasourceTester {
public static void main(String... args)
throws MaximumNumberOfSessionsExceededException, IOException,
AuthenticationException {
Connection con = ConnectionManager.getConnection("localhost", 11111,
ConnectionManager.SOCKET_MODE, "Admin", "Admin");
con.connect();
Project pr = con.getProjectByName("Mithras Energy");
UserService us = pr.getUserService();
Language lang = pr.getMasterLanguage();
ContentStoreRoot rt = (ContentStoreRoot) us.getStore(
Store.Type.CONTENTSTORE, false);
Content2 cont = rt.getContent2ByName("pressreleases");
EntityType entityType = cont.getEntityType();
Session sess = cont.getSchema().getSession();
Entity ent = null;
/*
* for (int i = 1; i < 1001; i++) { ent =
* sess.createEntity(entityType.toString());
*
* ent.setValue("Headline_DE", "Headline " + i);
*
* ent.setValue("Subheadline_DE", "Subheadline " + i);
* System.out.println("Created Entity number " + i); if (i % 100 == 0) {
* sess.commit(); } } sess.commit();
*/
for (int i = 1; i < 1001; i++) {
ent = sess.createEntity(entityType.toString());
Dataset d = cont.getDataset(ent);
FormData fd = d.getFormData();
fd.get(lang, "cs_headline").set("Headline_" + i);
fd.get(lang, "cs_subheadline").set("Subheadline_" + i);
d.setFormData(fd);
System.out.println("Created Entity number " + i);
if (i % 100 == 0) {
sess.commit();
}
}
sess.commit();
sess.close();
con.disconnect();
}
}
Freundliche Grüße
Ismail
Hallo Martin,
folgende Beispielklasse erzeugt auf 2 verschiedene Weisen Datensätze und setzt ihre Werte. Es wurde die Datenquelle pressreleases aus dem Mithras Energy Projekt genommen. Sie erzeugt die Datensätze, gibt sie allerdings nicht frei. Dies tut man am besten hinterher manuell (Hierbei muss man dann natürlich auf die Befüllung aller Pflichtfelder achten). Die nicht einkommentierte Variante setzt die Werte über das FormData-Objekt. Commited werden sollte in regelmäßigen Abständen, da sonst der Speicher vollläuft. Aber auch nicht nach jedem, das macht sich laufzeittechnisch negativ bemerkbar.
public class DatasourceTester {
public static void main(String... args)
throws MaximumNumberOfSessionsExceededException, IOException,
AuthenticationException {
Connection con = ConnectionManager.getConnection("localhost", 11111,
ConnectionManager.SOCKET_MODE, "Admin", "Admin");
con.connect();
Project pr = con.getProjectByName("Mithras Energy");
UserService us = pr.getUserService();
Language lang = pr.getMasterLanguage();
ContentStoreRoot rt = (ContentStoreRoot) us.getStore(
Store.Type.CONTENTSTORE, false);
Content2 cont = rt.getContent2ByName("pressreleases");
EntityType entityType = cont.getEntityType();
Session sess = cont.getSchema().getSession();
Entity ent = null;
/*
* for (int i = 1; i < 1001; i++) { ent =
* sess.createEntity(entityType.toString());
*
* ent.setValue("Headline_DE", "Headline " + i);
*
* ent.setValue("Subheadline_DE", "Subheadline " + i);
* System.out.println("Created Entity number " + i); if (i % 100 == 0) {
* sess.commit(); } } sess.commit();
*/
for (int i = 1; i < 1001; i++) {
ent = sess.createEntity(entityType.toString());
Dataset d = cont.getDataset(ent);
FormData fd = d.getFormData();
fd.get(lang, "cs_headline").set("Headline_" + i);
fd.get(lang, "cs_subheadline").set("Subheadline_" + i);
d.setFormData(fd);
System.out.println("Created Entity number " + i);
if (i % 100 == 0) {
sess.commit();
}
}
sess.commit();
sess.close();
con.disconnect();
}
}
Freundliche Grüße
Ismail
Vielen Dank Ismail, funktioniert hervorragend. Es ist also weder ein Locking der frisch erstellten Entity, noch der Datenquelle notwendig? Auch der Aufruf von content2.save() war scheinbar überflüssig. In welchem Fall sind denn diese Funktionen überhaupt erforderlich?