style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Solucionado!!!!!!!!!!! Problemas con executeUpdate() en HIBERNATE 3.2.2

Gracias por anticipado!!

Estoy desarrollando un batch con java que consta de actualizar aproximadamente 60,000 registros a lo mucho, solo necesito actualizar por cada registro 4 columnas a la hora de ejecutar mi metodo updateQuery entra y actualiza solamente dos registros sin problemas pero al momento de seguir con el tercer registro se queda sin avanzar exactamente en el executeUpdate.

El metodo que actualiza es el siguiente :

// Tengo configurado spring para tratar las transacciones mediante anotacion
@Transactional(propagation = Propagation.REQUIRED)
        public void updateQuery(String saveHQL){
                Query query;
                try{
                        Session session = getSession();
                        query = session.createQuery(saveHQL);
                        System.out.println(query.toString());
                        query.executeUpdate(); // **************************ES AQUI DONDE SE DETIENE SIN MANDARME NADA
                }catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("" + e.getLocalizedMessage() + " : " + e.getMessage() + " : " + e.getCause() + " : " + e.getStackTrace());
                        System.out.println("Error save query: " + saveHQL);
                }
        }
<code>

Posteriormente pensando que era mi metodo que estaba mal lo implemente dejando que hibernate controlara la transaccion y lo implemente de la siguiente manera :
<code>

public void updateQueryOrder(String cost , Integer idItem){
                try{
                        SessionFactory factory = getSessionFactory();
                        Session session = factory.openSession();
                        Transaction tx = session.beginTransaction();
                        String hqlUpdate = "update CuboPriceCostCurrent set cost = :cost" +
                        " where idCuboPriceCost = :idCuboPriceCost";
                        // or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
                        int updatedEntities = session.createQuery(hqlUpdate)
                        .setParameter("cost", cost)
                        .setParameter("idCuboPriceCost", idItem)
                        .executeUpdate();
                        tx.commit();
                        session.close();
                        System.out.println(updatedEntities);
                }catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("" + e.getLocalizedMessage() + " : " + e.getMessage() + " : " + e.getCause() + " : " + e.getStackTrace());
                        System.out.println("Error save query: " + "updateQuery OrderEntry");
                }
        }

<code>

/]/Y en este caso tambien me actualiza solamente 2 registros y al llegar al tercero se queda pasmado en esta linea
//"Transaction tx = session.beginTransaction();"

//LEs muestro la configuracion de hibernate para que me apoyen en decirme si esque me falta algo

<property name="hibernateProperties">
               <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.format_sql">false</prop>
                    <prop key="hibernate.query.substitutions">true 1, false 0</prop>
                   
               </props>
           </property>
           
           <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory"/>
          </bean>

//************************************************************************************************************************************

Estoy utilizando Mysql como Gestor de base de datos , agradezco sus comentarios por adelantado ..  y la verdad necesito ideas porque nose que este pasando .. es decir !!! ALGUIEN TENDRA IDEA de lo que me esta pasando en mi codigo ... jejeje las mayusculas son como un grito de ayuda !!! ajaja SALUDOS

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Intenta limpiar la sesion

usa session.clear(); antes de iniciar la transaccion y ademas un consejo... cuando haya excepciones dale un rollback a la trnsaccion
A ver si es eso. Nos avisas del resultado

   


Editado:
Por cierto eso de que al hacer un update y no te salga ninguna excepcion... si te pasa que a partir de ahi ya no puedes consultar esa misma tabla es porque "la alberca de conexiones" Connection Pool esta intentando repsuesta de la tabla y es por eso que se queda bloqueada... veo que no usas pool explicitamente pero si algun dia te pasa tambien es recomendable revisar esto que te digo... a mi me sucedia que tronaba y no veia las excepciones sino hasta que detenia mi AppServ
Imagen de ezamudio

connection pool

Por eso si usan piscina de conexiones deben configurarla correctamente, poniendo un tiempo maximo de espera para conexion disponible, maximo de conexiones a crear, etc.

Imagen de rj@vasso

Muchas gracias por contestar ...

ya he agregado el session.clear (); antes de crear mi transaccion, pero obtengo el mismo resultado , he revisado mi configuracion de mi conexion y la tengo de la siguiente manera esta esta en un archivo de configuracion que es la que obtiene la conexion real...

//Archivo Context.xml

<Resource auth="Container"
                driverclassname="com.mysql.jdbc.Driver"
                maxactive="100"
                maxidle="30000"
                maxwait="30000"
                name="alias"
                password="passwordl"
                type="javax.sql.DataSource"
                url="jdbc:mysql://localhost:3306/esquema"
                username="user">
</Resource>
<blockcode>

En el archivo de hibernate tengo lo siguiente :

<code>
<property name="hibernateProperties">
               <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.format_sql">false</prop>
                    <prop key="hibernate.query.substitutions">true 1, false 0</prop>
                   
               </props>
 </property>

<blockcode>

de igual manera tengo

<!--Configuracion de la conexion a base de datos-->
        <!--Configuracion de carga de archivos de propiedades-->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="locations">
                        <list>
                                <value>classpath:database.properties</value>
                        </list>
                </property>
        </bean>

        <!-- JNDI DataSource for J2EE environments -->
        <!-- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/_iresmas"/>-->
        <jee:jndi-lookup id="dataSource" jndi-name="${database.resource}"/>

<blockcode>

EL data source al cual hago referencia tiene las mismas propiedades que Archivo Context.xml que coloque en la parte de arriba.

// Realmente es lo que tengo relacionado con las conexiones de mi base de datos  cabe mencionar que estoy en un proyecto donde ya estaba configurado hibernate con sus templates y funcionan en cuestion altas , bajas , cambios y con nativos .. el proyecto ya esta avanzado y no habia tenido problemas con las conexiones , las transacciones las manejo con Spring en forma de anotaciones ya que ahora investigando este error veo que existen varias formas ,  y quiza le falte ha esta configuracion !!!  que me recomiendan utilizar , ya que ahora veo que posiblemente necesito configurar un pool.y ya que estoy de encargado y justamente ahora voy a empezar con un modulo de transacciones parece que voy a tener que hacer la configuracion optima !!!! cabe mencionar que estoy con apache no tengo como tal un servidor de aplicaciones .. que es lo que me recomiendan para arreglar esto o algunos tutoriales para saber que manera me conviene hacer la configuracion sin el riesgo de impactar al proyecto ...  nuevamente gracias por contentestar y compartir sus conocimientos .  

StackTrace

Si tienes forma de obtener un stackTrace seria bueno publicarlo... quizas todo este bien pero tienes un error en SQL, viloacion de duplicidad, de datos nulos, de llaves invalidas

La configuracion que pones está bien... solo me llama la atencion es que en maxidle="30000" le hayas asignado un tempo muy largo

Imagen de neko069

No haz intentado con un

No haz intentado con un simple update()?? en un ciclo for, y hacer session.flush() cada X registros?
Por cierto, en tu propiedad <prop key="hibernate.show_sql">false</prop> cámbiala a TRUE para que asegures que no es por el lado de algún dato que se te esté escapando la causa del atascón que estás sufriendo....

UPDATE: Encontré ésta liga con un ejemplo ( ya la había publicado @ezamudio en algún post )

Posible solucion

Eso puede ayudarte si tus objetos ya los tienes relacionados con las llaves foraneas porque porejemplo si tienes

class Usuario{
    private int idUsuario;
    private String nombre, apellido, algo;
    private Intereses intereses;
}

y solo necesitas editar el nombre pues que crees que con el <code>update(usuario)

debes definir las demas propiedades incluso el id de la tabla propiedades... la ventaja del UPDATE FROM tabla SET ... es que no necesitas definir lo demas que NO va a tener cambio

Imagen de rj@vasso

Gracias nuevamente ... pero obtengo lo mismo

He probado el session.flush() por cada registro como se muestra con el siguiente codigo pero lo unico que hemos logrado esque se actualize un registro mas ya que ahora cuando llega al registro hasta el registro numero 3 y ya no modifica el cuarto

public void updateQueryOrder(String cost , Integer idItem){
                try{
                        SessionFactory factory = getSessionFactory();
                        Session session = factory.openSession();
                        session.flush();
                        session.clear();
                        Transaction tx = session.beginTransaction(); // ***********AQUI ES DONDE SE ATASCA Y NO ENTRA A NINGUN LADO
                        String hqlUpdate = "update CuboPriceCostCurrent set cost = :cost" +
                        " where idCuboPriceCost = :idCuboPriceCost";
                        // or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
                        int updatedEntities = session.createQuery(hqlUpdate)
                        .setParameter("cost", cost)
                        .setParameter("idCuboPriceCost", idItem)
                        .executeUpdate();
                        tx.commit();
                        session.close();
                       
                        System.out.println(updatedEntities);
                }catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("" + e.getLocalizedMessage() + " : " + e.getMessage() + " : " + e.getCause() + " : " + e.getStackTrace());
                        System.out.println("Error save query: " + "updateQuery OrderEntry");
                }

//Este es mi Entity que utilizo

public class CuboPriceCostCurrent {
       
        private Integer idCuboPriceCost;
        private Integer idPriceList;
        private Integer idCostList;
        private String styleItem;
        private String price;
        private String cost;
        private String codeQuality;

         //Con sus respectivos getter y setter

}

//Posteriormente este es mi mapeo

<class name="CuboPriceCostCurrent" table="cubo_price_cost_current">
       
       <id name="idCuboPriceCost" type="integer" column="IDCUBOPRICECOST">
         <generator class="native" />
        </id>
     
      <property    name="idPriceList"   column="IDPRICELIST" type="integer"/>
      <property    name="idCostList"    column="IDCOSTLIST"  type="integer"/>
      <property    name="styleItem"     column="STYLEITEM"       type="string"/>
      <property    name="price"                 column="PRICE"           type="string"/>
      <property    name="cost"                  column="COST"            type="string"/>
      <property    name="codeQuality"   column="CODEQUALITY"   type="string"/>
    </class>

Agradezco las sugerencias  si tienen alguna idea mas !! cabe mencionar que para poder encontrar dicho error mi tabla de mi base de datos no contiene FK .. y que por datos no es, ya que ha avanzado un registro mas ... pero no logro obtener el msn error ...

Tienen alguna idea ya que mi desesperacion me esta insitando a que mejor ponga una tortilleria jejej ... Gracias  

Bueno, el session.flush() va

Bueno, el session.flush() va al final, despues del executeUpdate() justo antes del session.close()

Imagen de neko069

Aquí tienes algunos

Aquí tienes algunos links:

tortilladoras lenin
Herramientas PYME
Tortilladoras automáticas
...
Qué? ... que no se diga que no te tendemos la mano, o no??

Como dice @jdd tu código puede ir:

String hqlUpdate = "update CuboPriceCostCurrent set cost = :cost  where idCuboPriceCost = :idCuboPriceCost";
int updatedEntities = session.createQuery(hqlUpdate).setParameter("cost", cost).setParameter("idCuboPriceCost", idItem)
                        .executeUpdate();
                        tx.commit();
                        session.flush();
                        session.close();
Imagen de rj@vasso

Gracias ,

si ya tambien lo probe asi !!! y esta igual

Imagen de neko069

Y ya probaste con un ciclo

Y ya probaste con un ciclo for como el ejemplo que te había señalado en la liga que te mostré en mi primer post?
( y ya estás checando las ligas de las máquinas tortilladoras ;¬) ... )

También le voy al pool

Creo que es cuestión de que revises tu pool de conexiones, y de ser tan amable, pongas porfavor el stacktrace, para poderte ayudar mejor.

Imagen de rj@vasso

Listo ,,, Solucionado !!!

Antes que nada agradezco las sugerencias y las ideas que todos me brindaron incluso los link del negocio de tortillas ... Vientos neko tu siempre tan colaborador !!!! jejej Saludos !!! El poblema que simplemente tenia esque la manera que estaba ejecutando el batch estaba bien , lo unico que no estaba bien es que en el ciclo integraba la creacion tanto de session es por tal motivo que la session se creaba una y otra vez segun fuera el tamaño del ciclo ... y por lo que entendi estaba saturando la memoria de hibernate es por eso que no me mandaba error ... eso supongo..

Por lo que lo unico que debe de estar en el ciclo es la ejecucion de ExecuteUpdate ()... y asi me ha funcionado ... esto gracias a sus tips y ideas

El codigo ha quedado de la siguiente manera:

try{
                        SessionFactory factory = getSessionFactory();
                        Session session = factory.openSession();
                        String hqlUpdate = "";
                        int i = 0;
                        for(CuboPriceCostCurrent current : listCubo){ // he aqui donde debio ir el ciclo desde el principio
                                i++;
                                hqlUpdate = "update CuboPriceCostCurrent set cost = :cost , idCostList = :idCostList" +
                                " where idCuboPriceCost = :idCuboPriceCost";
                                System.out.println(hqlUpdate);
                                session.createQuery(hqlUpdate)
                                .setParameter("cost", current.getCost())
                                .setParameter("idCuboPriceCost", current.getIdCuboPriceCost())
                                .setParameter("idCostList", current.getIdCostList())
                                .executeUpdate();
                        }
                        session.flush();
                        session.close();
                }catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("" + e.getLocalizedMessage() + " : " + e.getMessage() + " : " + e.getCause() + " : " + e.getStackTrace());
                        System.out.println("Error save query: " + "updateQuery OrderEntry");
                }

Una vez mas Muchas gracias

Imagen de neko069

Y bueno, por fin como

Y bueno, por fin como configuraste la transacción? mediante anotación de Spring?

Apuesto a que no lo hizo

El codigo cata por s solo y esta creando sesiones manualmente (cosa que no es muy recomendable)...En otro post se habia recomendado el uso de getCurrentSession();

   
De hecho los porblemas son bastante similares

Imagen de rj@vasso

Que descuido ...

Si compañeros utilice el control de transacciones con la anotacion de Srping

@Transactional (propagation = Propagation.REQUIRED)
        public void updateQueryOrder(List<CuboPriceCostCurrent> listCubo){
                try{

Entiendo que Cuando uno utiliza transacciones con Spring con anotaciones y detecta alguna Exception realiza el Roll Back es asi como identifico que si causo algun error entonces realizo un texto palno de informacion al usuario de lo contrario verifico que la informacion este persistida y tambien tengo entendido que esto de Propagation.Required

Si el método es invocado desde un contexto transaccional, entonces el método será invocado en el mismo contexto transaccional. Si el método no es invocado desde un contexto transaccional, entonces el método creará una nueva transacción e intentará comprometer(commit) la transacción cuando el método termine su ejecución.

Asi es como estoy controlando este tema de las transacciones multiples por llamarlo asi !!! que opinan ? es buena conforme a su experiencia ?

y me esta funcionando sin ningun problema hasta ahora .. pero me intereso mucho lo que comentaste java.daba.dooo voy a leer este post para mantenerme mas informado de lo que trato de hacer con esto de sesiones ... Muchas gracias por las referencias ...

y nuevamente agradesco sus comentarios !!

Imagen de neko069

Complemento

Puedes checar éste blog post para que cheques si necesitas (o llegaras a necesitar ) alguna propiedad extra en tu configuración de la transacción.

Un abrazo

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">