Hibernate, JDBC taille de Lot n'est pas de travail
Je suis en utilisant SpringFramework 3 et Hibernate 4 et MySQL 5 avec jpa. Mon code de test ressemble...
@Repository
public class TestRepositoryImpl implements TestRepository {
@PersistenceContext
private EntityManager em;
@Override
@Transactional
public void insertBulk() {
Item it;
for(int i= 0; i<1000;i++) {
it = new Item();
it.setPrice(Math.random()*100);
em.persist(it);
}
}
}
Ma configuration spring
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="application" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
mon persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="application" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.springapp.test.domain.Item</class>
<class>com.springapp.test.domain.Order</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testdb" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.jdbc.batch_size" value="20" />
</properties>
</persistence-unit>
</persistence>
Quand je lance mon code, il va feux de requête d'insertion 1000 fois au lieu de licencier 50 requête d'insertion. Quel est le problème?
Merci de m'aider à l'insertion dans l'accord de projet conjoint de l'utilisation d'hibernate
veuillez ajouter de la pile tracce
Désolé... Il n'y a pas d'exception ou de toute erreur dans ce code. Le Code fonctionne très bien mais sur console il imprime 1000 fois requête d'insertion.
Désolé... Il n'y a pas d'exception ou de toute erreur dans ce code. Le Code fonctionne très bien mais sur console il imprime 1000 fois requête d'insertion.
OriginalL'auteur Mitesh | 2014-01-22
Vous devez vous connecter pour publier un commentaire.
Veuillez noter que Hibernate désactiver insérer le dosage à l'JDBC niveau de manière transparente si la clé primaire de l'insertion de la table de isGenerationType.L'identité.
save() un seul dossier et ensuite, la méthode flush(), donc il y a seulement un ajout SQL INSERT à être traités pour chaque chasse d'eau. C'est pourquoi, Hibernate ne peut pas vous aider à lot insertion comme il y a un seul INSERT SQL pour être traitées. Vous devez l'enregistrer() jusqu'à un certains nombre de documents avant d'appeler la méthode flush() au lieu d'appeler la méthode flush() pour chaque save().
Meilleures pratiques de lot de l'insertion est quelque chose comme ceci:
Vous enregistrer et de vider les dossiers de lot par lot. À la fin de chaque lot, vous devez effacer le contexte de persistance pour libérer la mémoire pour éviter l'épuisement de la mémoire que chaque objet persistant est placé dans la première mémoire cache de niveau (votre JVM de mémoire). Vous pouvez également désactiver le cache de second niveau pour réduire la surcharge inutile.
De bien vouloir vérifier ce lien http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/batch.html
stackoverflow.com/questions/2773302/... de bien vouloir vérifier cette access.redhat.com/site/documentation/en-US/...
OriginalL'auteur Sureshkumar Panneerselvan
Vous avez mal compris "taille de lot". La taille des lots signifie envoyer "taille de lot" nombre de requêtes en une seule fois au lieu d'envoyer à chaque requête que le code des incendies de la requête. Par conséquent, dans ce cas, il y aura 1000 requêtes de type insert, envoyé 50 fois avec 20 requêtes de type insert dans chaque lot.
OriginalL'auteur RaviH
ajouter enregistreur de
org.hibernate.engine.jdbc.batch.internal.BatchingBatch
dans le niveau de débogage.hibernate peut générer des lots de taille 1 ou 2 en cas d'erreur de commande de plaquettes.
essayez d'utiliser
hibernate.order_inserts=true hibernate.order_updates=true
OriginalL'auteur Андрей Б