Pourquoi un simple Hibernate findOne () par key primaire prend-il autant de time?

Je dissocie ceci d' une question antérieure pour éliminer la confusion «choisir avant de sauvegarder». Dans cet exemple, j'essaie de faire une simple findOne () par key primaire. Ceci est contre un sqlserver db existant, avec les dernières versions des données de démarrage de spring et de spring.

J'ai l'set de notation ainsi je peux voir le sql que le hibernate a produit. Dans cet exemple, en fonction du timing de journalisation, cette requête prend environ 4 secondes. C'est l'interrogation avec une key primaire. Lorsque je lance le sql que hibernate génère dans un outil db comme dbvisualizer, il returnne en sous-seconde, comme je m'y attendais.

J'ai augmenté la journalisation de l'empackageage d'hibernation au niveau de TRACE, pour essayer de voir où le retard est, et ai trouvé ce qui suit, avant et après le timeout de 4 secondes:

2017-08-14 09:51:35.345 DEBUG 7532 --- [nio-8085-exec-1] org.hibernate.SQL : select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from xbr_customer_tab customer0_ where customer0_.customer_id=? Hibernate: select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from xbr_customer_tab customer0_ where customer0_.customer_id=? 2017-08-14 09:51:35.470 TRACE 7532 --- [nio-8085-exec-1] ohrjiResourceRegistryStandardImpl : Registering statement [org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy[Proxy=25287222; Query=select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from xbr_customer_tab customer0_ where customer0_.customer_id=?; Delegate=SQLServerPreparedStatement:6]] 2017-08-14 09:51:35.471 TRACE 7532 --- [nio-8085-exec-1] ohejdbc.internal.JdbcCoordinatorImpl : Registering last query statement [org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy[Proxy=25287222; Query=select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from xbr_customer_tab customer0_ where customer0_.customer_id=?; Delegate=SQLServerPreparedStatement:6]] 2017-08-14 09:51:35.479 TRACE 7532 --- [nio-8085-exec-1] ohtype.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [40666316] 2017-08-14 09:51:35.488 TRACE 7532 --- [nio-8085-exec-1] ohlpeiAbstractLoadPlanBasedLoader : Bound [2] parameters total 2017-08-14 09:51:39.426 TRACE 7532 --- [nio-8085-exec-1] ohrjiResourceRegistryStandardImpl : Registering result set [SQLServerResultSet:6] 2017-08-14 09:51:39.434 TRACE 7532 --- [nio-8085-exec-1] ohlpepiResultSetProcessorImpl : Processing result set 2017-08-14 09:51:39.434 DEBUG 7532 --- [nio-8085-exec-1] ohlpepiResultSetProcessorImpl : Starting ResultSet row #0 2017-08-14 09:51:39.436 DEBUG 7532 --- [nio-8085-exec-1] lpepiEntityReferenceInitializerImpl : On call to EntityIdentifierReaderImpl#resolve, EntityKey was already known; should only happen on root returns with an optional identifier specified 2017-08-14 09:51:39.436 TRACE 7532 --- [nio-8085-exec-1] lpepiEntityReferenceInitializerImpl : hydrating entity state 

Je me request aussi pourquoi il dit 2 parameters liés, quand il y avait seulement 1 dans le sql.

Des idées pour lesquelles ce choix prend si longtime? Surtout seulement dans mon application de spring, et pas dans un autre client comme dbvisualizer?

Voici l'entité:

 import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "my_customer_table") public class Customer { @Id private Ssortingng customer_id; private Ssortingng first_name; private Ssortingng last_name; protected Customer() {} public Customer(Ssortingng firstName, Ssortingng lastName) { this.first_name = firstName; this.last_name = lastName; } } 

Voici le CustomerRepository

 import com.....Customer; import org.springframework.data.repository.CrudRepository; public interface CustomerRepository extends CrudRepository<Customer, Ssortingng> { } 

et le code pour searchr un client, à partir d'une class @Service dans laquelle CustomerRepository est @Autorisé dans:

 Customer customer = customerRepository.findOne(customerId); 

Voici le sql généré:

 select customer0_.customer_id as customer1_4_0_, customer0_.first_name as first_na2_4_0_, customer0_.last_name as last_nam3_4_0_ from my_customer_table customer0_ where customer0_.customer_id=? 

Corrigé en ajoutant le paramètre suivant à votre string de connection dans la source de données.

 sendSsortingngParametersAsUnicode=false 

Plus de détails: http://www.jochenhebbrecht.be/site/2014-05-01/java/fixing-slow-queries-running-sql-server-using-jpa-hibernate-and-jtds