繁体   English   中英

Spring Data JPA:非常慢的插入和选择查询

[英]Spring Data JPA: very slow insert and select queries

我有一个非常简单的spring-data-jpa + Hibernate应用程序,它将客户数据存储在MySql数据库中(完整的源代码发布在这里 )。

问题是它运行插入选择查询非常慢 ,与我通过mysql CLI进行比较:

  • 插入一行需要~ 3600ms
  • 选择全部(仅2行)需要~ 1700ms
  • 两个查询都在mysql CLI中大约0.12s

有讨论过类似的问题在这里 ,但在我的情况的测量方式更糟(尽管我不插入批次,它只是一个简单的排DB)。 有没有办法提高Spring JPA / Hibernate的性能?

另一个问题是,有没有办法减少spring-data-jpa和hibernate-entitymanager的大小? 我能够排除byte-buddy和jandex依赖项而不会对程序造成伤害,但这只是几个Mbs(阴影jar大小从19.6Mb下降到16.6Mb)?

更新根据请求,这里是代码(所有来源都在这里 ):

@Entity
@AttributeAccessor("field")
@Table(name = "customer")
public class Customer implements Serializable{
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name="id",unique=true, nullable=false, insertable=true, updatable=true)
  @Type(type="long")
  private Long id;

  @Column(name = "name")
  private String name;
//+ constructors, getters/setters
}

这是Spring应用程序,也是保存(插入)客户:

public class Application {
  private static ApplicationContext applicationContext;

  static CustomerRepository customerRepository;

  public static void main(String[] args) throws InterruptedException {

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MySQLAutoconfiguration.class);

    customerRepository = ctx.getBean(CustomerRepository.class);
    runTest();
  }

private static void runTest () throws {
...
//insert
  Customer customerJohn = customerRepository.save(new Customer("John"));
//select
  Customer foundEntity = customerRepository.findOne(customerJohn.getId());
...
}

和配置:

@Configuration
@ComponentScan
@EnableJpaRepositories (basePackages = "com.vk.dal.repository")
@PropertySource("classpath:mysql.properties")
public class MySQLAutoconfiguration {

  @Autowired
  private Environment env;

  @Bean
  public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username") != null ? env.getProperty("spring.datasource.username") : "");
    dataSource.setPassword(env.getProperty("spring.datasource.password") != null ? env.getProperty("spring.datasource.password") : "");

    return dataSource;
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
    final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource);
    em.setPackagesToScan("com.vk.dal.domain");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    Properties properties = additionalProperties();
    if (properties != null) {
      em.setJpaProperties(properties);
    }
    return em;
  }

  @Bean
  JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
  }


  final Properties additionalProperties() {
    final Properties hibernateProperties = new Properties();

    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("mysql-hibernate.hbm2ddl.auto"));
    hibernateProperties.setProperty("hibernate.dialect", env.getProperty("mysql-hibernate.dialect"));
    hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("mysql-hibernate.show_sql") != null ? env.getProperty("mysql-hibernate.show_sql") : "false");

    return hibernateProperties;
  }

}

感谢任何帮助。

我有相同的结果,在我的情况下问题与数据库服务器有关。 服务器是远程的,执行查询太慢了。 当我将我的应用程序部署到同一台服务器时,它变得足够快。 插入具有许多依赖项(一对多,多对一)的对象现在需要190毫秒。 选择此对象需要61ms。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM