2017-10-16 4 views
0

J'utilise spring boot et je voudrais changer le niveau d'isolement par défaut à READ_UNCOMMITTED.Modifier le niveau d'isolation - hibernate.connection.isolation ne fonctionne pas

J'ai cherché et trouvé la propriété hibernate.connection.isolation, mais j'ai essayé et cela n'a pas fonctionné.

Ma configuration est la suivante:

private Properties additionalJpaProperties() { 
     Properties properties = new Properties(); 

     properties.setProperty("hibernate.hbm2ddl.auto", "validate"); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect"); 
     properties.setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_READ_UNCOMMITTED)); 

     return properties; 
    } 

    @Primary 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) throws SQLException { 

     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 
     em.setPackagesToScan(this.packages); 
     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(this.additionalJpaProperties()); 
     return em; 
    } 

Comment puis-je modifier le niveau d'isolement à l'aide de démarrage au printemps?

Répondre

0

Si quelqu'un a besoin de la solution. La seule solution que j'ai trouvée était la suivante:

Étendre la classe HibernateJpaDialect et implémenter la méthode beginTransaction pour définir l'isolation des transactions. Il ressemble à ceci:

@Service 
public class CustomHibernateJpaDialect extends HibernateJpaDialect { 

    @Override 
    public Object beginTransaction(final EntityManager entityManager, 
      final TransactionDefinition definition) throws PersistenceException, 
      SQLException, TransactionException { 

     Session session = getSession(entityManager); 

     if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) { 
      session.getTransaction().setTimeout(definition.getTimeout()); 
     } 

     entityManager.getTransaction().begin(); 

     session.doWork(new Work() { 
      public void execute(Connection connection) throws SQLException { 
       DataSourceUtils.prepareConnectionForTransaction(connection, definition); 
       connection.setTransactionIsolation(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); 
      } 
     }); 

     return prepareTransaction(entityManager, definition.isReadOnly(), definition.getName()); 
    } 

} 

Et dans la configuration de l'EntityManagerFactory il est nécessaire de définir le dialecte créé:

@Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      DataSource dataSource, 
      CustomHibernateJpaDialect customHibernateJpaDialect) throws SQLException { 

     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaDialect(customHibernateJpaDialect); 

     return em; 
    }