Hallo,
ich habe Problem das ich eine Menge der Daten zu löschen habe und das dieses sehr lange dauert.
Kann ich vielleicht Daten Löschen ohne das ich über Hibernate dieses tue?
Gibt es Möglichkeit die Geschwindigkeit zu verbessern, indem ich vielleciht meinen unten stehenden Code ändere?
Name and version of the database you are using:
MySQL
Source Code
public class DeleteBLSVersionen extends BaseLongRunningJob {
private static Logger logger = Logger.getLogger(DeleteBLSVersionen.class);
private int C_MAX= 100; // Dient um jedes Objekt mit diesen Wert zu multiplizieren um ungäfähre Anzahl der Daten die zu duplizieren zu eraten.
private int C_TRANSACTION= 500; // Dient um nach diesen Anzahl der Datensätze die transaktion durchzufphren.
private int blsversionid;
private Blsversion blsversion= null;
private BlsversionDAO blsversionDAO= new BlsversionDAO();
private Session ses= null;
protected BlsdatDAO blsdatDAO= new BlsdatDAO();
public DeleteBLSVersionen(int blsversionid, String threadtyp, int length) {
super("", threadtyp, length);
this.blsversionid= blsversionid;
}
public DeleteBLSVersionen(int blsversionid, String threadtyp) {
this(blsversionid, threadtyp, StringConstants.HALF_HOUR);
}
private void updateDescription() {
if (blsversion==null) {
return;
}
setBeschreibung(MessageFormat.format(StringConstants.DESCRIPTION_VERSION_DELETE, blsversion.getBezeichnung()));
updateStatus();
}
public Session getSession() {
AuditLogInterceptor interceptor= new AuditLogInterceptor();
Session ses= HibernateUtil.getSessionFactory().openSession(interceptor);
interceptor.setSession(ses);
return ses;
}
public static Field[] getAllFields(Class objectClass, Field[] fields) {
Field[] newFields = objectClass.getDeclaredFields();
int fieldsSize = 0;
int newFieldsSize = 0;
if(fields != null) {
fieldsSize = fields.length;
}
if(newFields != null) {
newFieldsSize = newFields.length;
}
Field[] totalFields = new Field[fieldsSize + newFieldsSize];
if(fieldsSize > 0) {
System.arraycopy(fields, 0, totalFields, 0, fieldsSize);
}
if(newFieldsSize > 0) {
System.arraycopy(newFields, 0, totalFields, fieldsSize, newFieldsSize);
}
Class superClass = objectClass.getSuperclass();
Field[] finalFieldsArray;
if (superClass != null && ! superClass.getName().equals("java.lang.Object")) {
finalFieldsArray = getAllFields(superClass, totalFields);
} else {
finalFieldsArray = totalFields;
}
return finalFieldsArray;
}
/**
* Die Methode delete sucht nach Referenzklassen und löscht diese zuerst.
* @param object Enthält die Daten der Referenzklassen.
*/
private void delete(Object object) {
if (object==null) {
return;
}
Class objectClass= object.getClass();
Field[] fields = Utilities.getAllFields(objectClass, null);
int nFLength= fields.length;
fieldIteration: for (int ii= nFLength-1; ii>=0; ii--) {
fields[ii].setAccessible(true);
if(Modifier.isTransient(fields[ii].getModifiers())
|| Modifier.isFinal(fields[ii].getModifiers())
|| Modifier.isStatic(fields[ii].getModifiers())) {
continue fieldIteration;
}
try {
Object objPropNewState = fields[ii].get(object);
if (objPropNewState instanceof java.util.Set) {
Iterator i= ((Set) objPropNewState).iterator();
while (i.hasNext()) {
Object newObject= (Object) i.next();
String clasz= Utilities.getClassName(newObject.getClass());
delete(newObject);
ses.delete(newObject);
logger.info(MessageFormat.format(StringConstants.LOGGER_DELETE_SUBDATA, (new Object[] {clasz})));
}
}
} catch (Exception e) {
setFehler(objectClass+": "+e.getMessage());
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
}
}
}
/**
* Die Methode findBLSVersionenAndDelete sucht nach Referenzklassen und löscht diese zuerst.
* @param object Enthält die Daten der Referenzklassen.
*/
private void findBLSVersionenAndDelete(Object object) {
if (object==null) {
return;
}
int count= 0;
String clasz= "";
String tmpClasz= "";
Transaction tx = null;
Class objectClass= object.getClass();
Field[] fields = Utilities.getAllFields(objectClass, null);
int nFLength= fields.length;
fieldIteration: for (int ii= nFLength-1; ii>=0; ii--) {
fields[ii].setAccessible(true);
if(Modifier.isTransient(fields[ii].getModifiers())
|| Modifier.isFinal(fields[ii].getModifiers())
|| Modifier.isStatic(fields[ii].getModifiers())) {
continue fieldIteration;
}
try {
Object objPropNewState = fields[ii].get(object);
if (objPropNewState instanceof java.util.Set) {
Iterator i= ((Set) objPropNewState).iterator();
setGesamtzeilen(getGesamtzeilen()+((Set)objPropNewState).size()-(C_MAX*10));
while (i.hasNext()) {
Object newObject= (Object) i.next();
if ((count % C_TRANSACTION)==0) {
tx =ses.beginTransaction();
}
try {
tmpClasz= Utilities.getClassName(newObject.getClass());
delete(newObject);
ses.delete(newObject);
count++;
if (((count % C_TRANSACTION)==0) || (!clasz.equalsIgnoreCase(tmpClasz))) {
clasz= tmpClasz;
count= 0;
tx.commit();
}
} catch (HibernateException e) {
setFehler(e.getMessage());
tx.rollback();
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
} catch (InfrastructureException e) {
setFehler(e.getMessage());
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
}
}
}
} catch (Exception e) {
setFehler(objectClass+": "+e.getMessage());
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
}
}
try {
if ((count % C_TRANSACTION)!=0) {
tx.commit();
}
} catch (HibernateException e) {
setFehler(e.getMessage());
tx.rollback();
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
} catch (InfrastructureException e) {
setFehler(e.getMessage());
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
}
}
@Override
protected boolean runLongJob() {
ses = getSession();
blsversion= blsversionDAO.get(blsversionid, ses);
if (blsversion==null) {
return false;
}
try {
findBLSVersionenAndDelete(blsversion);
Transaction tx =ses.beginTransaction();
try {
blsversionDAO.delete(blsversionid, ses);
tx.commit();
logger.info(MessageFormat.format(StringConstants.LOGGER_DELETE_HEAD_END, (new Object[] {Utilities.getClassName(Blsversion.class), blsversion.getUserVisibleId()})));
} catch (HibernateException e) {
setFehler(e.getMessage());
tx.rollback();
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
} catch (InfrastructureException e) {
setFehler(e.getMessage());
String msg = StringConstants.ERROR_MSG + e.getMessage();
logger.error(msg, e);
}
} finally {
ses.close();
}
return true;
}
}
mfg,
Stasa Jerinic
|