Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringDataJPA:非常慢的插入和选择查询_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

Java SpringDataJPA:非常慢的插入和选择查询

Java SpringDataJPA:非常慢的插入和选择查询,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我有一个非常简单的SpringDataJPA+Hibernate应用程序,它将客户数据存储在MySql数据库中(完整的源代码已经发布) 问题在于,与mysql CLI相比,它运行insert和select查询的速度非常慢 插入一行需要3600毫秒 全选(仅2行)耗时~1700ms 这两个查询都采用mysql CLI,大约0.12s 这里讨论了一个类似的问题,但是在我的例子中,测量结果要糟糕得多(即使我没有插入批处理,它只是DB中的一个简单行)。在SpringJPA/Hibernate中有没有

我有一个非常简单的SpringDataJPA+Hibernate应用程序,它将客户数据存储在MySql数据库中(完整的源代码已经发布)

问题在于,与mysql CLI相比,它运行insert和select查询的速度非常慢

  • 插入一行需要3600毫秒
  • 全选(仅2行)耗时~1700ms
  • 这两个查询都采用mysql CLI,大约0.12s
这里讨论了一个类似的问题,但是在我的例子中,测量结果要糟糕得多(即使我没有插入批处理,它只是DB中的一个简单行)。在SpringJPA/Hibernate中有没有提高性能的方法

另一个问题是,有没有办法减少spring数据jpa和hibernate entitymanager的大小?我能够排除byte-buddy和jandex依赖项,而不会对程序造成损害,但这仅仅是几MB(着色jar大小从19.6Mb降至16.6Mb)

更新 根据要求,以下是代码(所有来源为):

这是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;
  }

}

非常感谢您的帮助。

您能添加一些您正在使用的类似代码的实体,以及您如何持久化和获取数据……在如此大的框架上的第一个操作需要大量的类加载、预热等。可能save()隐藏了这个问题,而时间是不正确的?@Ashish451added@JacekCz,我想我在加载Spring后运行save()。不管怎么说,Spring\Hibernate确实非常繁重,但降级的程度太糟糕了:每插入一条记录超过3秒,每选择一条记录几乎2秒——这太多了。没有一部作品能忍受这种情况。我也有类似的事情发生在我身上。你能找到解决办法吗?
@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;
  }

}