Pregunta

Estoy desarrollando un sistema de contabilidad de doble entrada y necesito para insertar registros contables sin huecos en el id secuencial. Dado que todos los accesos a la base de datos va a pasar a través de una aplicación web, estoy tomando el cuidado de la generación de Identificación del uso de una variable estática sincronizado:

import org.hibernate.*;

public class JournalService {    
    private static Object journalLock = new Object();    
    private Session session;

    public JournalService(Session session) {
        this.session = session;
    }

    public void insertJournalEntry(JournalEntry journalEntry) {
        Set<PostEntry> entries = journalEntry.getEntries();

        double total = 0;

        for (PostEntry entry : entries) {
            total += entry.getAmount();
        }

        if(total != 0)
            throw new InvalidParameterException("Journal entry is invalid. The sum of all entries must be zero.");

        Criteria criteria = session.createCriteria(PostEntry.class);
        criteria.setMaxResults(1);
        criteria.addOrder(Order.desc("id"));
        //here I add some other criteria
        synchronized(journalLock) {            
            PostEntry lastEntry = criteria.uniqueResult();
            long currentId = lastEntry.getId();

            for (PostEntry entry : entries) {
                entry.setId(currentId++)
                session.save(entry);
            }            
            session.save(journalEntry);
        }
    }
}

En pocas palabras, este servicio tiene una vida ligada a la corriente HttpRequest y es administrado por un recipiente de primavera, además me aseguro de que toda la transacción se compromete al final de la solicitud. El bloque sincronizado se hará cargo de cualquier concurrencia de modo que no hay manera cualquier vacío que ocurrirá en la secuencia de la ID.   El gran problema aquí es la añade sobrecarga de acceso de base de datos para seleccionar el último registro insertado que coincide con un cierto criterio. No quiero que esto suceda así que supongo que la solución aquí es utilizar una memoria caché que llevará a cabo el último registro insertado primera vez su seleccionado, por lo que no se necesita el acceso de base de datos para generar el id.   Mi pregunta: ¿Hay alguna forma de hibernación fuera de la caja de resolver esto? Soy nuevo en hibernación y oído acerca de la cache, pero no estoy seguro de cómo usarlo. No quiero que la memoria caché para almacenar todos los valores almaceno utilizando este servicio, sólo se necesita almacenar la última entrada insertada que coincide con un cierto criterio. Por ejemplo, si I perfomed cinco inserciones, en la que dos partidos una igualdad de criterios de 'x' y los otros tres coincide con un criterio 'Y', la caché sólo tendrán dos objetos almacenados (el último objeto insertado que coincide con cada criterio).   Yo podría aplicar esto a mí mismo, pero yo prefiero usar una solución que se integra con la API de hibernación.

¿Fue útil?

Solución

El almacenamiento en caché es más adecuado para almacenar de acceso frecuente pero rara vez modificados objetos . lo que no es lo que está tratando de hacer. Se podría utilizar la transacción serializable que evita que perdieron actualizaciones y inconsistente lee que es lo que están tratando de evitar. Pero se debe tener en cuenta sus gastos generales.

// Hibernate Transaction isolation level settings
// Serializable isolation level
hibernate.connection.isolation=8

Aquí va lo que API SessionFactory dice

  

El comportamiento de un SessionFactory es controlada por propiedades suministrados en el momento de configuración . Estas propiedades se definen sobre el Medio Ambiente.

Como solución, puede configurar dos SessionFactory distinta, donde uno de ellos es serializable como se muestra arriba.

Debido a que va a recuperar El último insertado PostEntry Entidad, I Think bloqueo pesimista no se aplica adecuadamente porque su base de datos simplemente bloquear la PostEntry recuperado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top