2016-08-24 18 views
0

私はHibernateから完全に空のMySQLテーブルに2500レコードを挿入しています。インサートは5分かかります!Hibernate + MySQLのシンプルなバッチ挿入が極端に遅い

私はグーグルグーグルで、自動生成された主キーのようないくつかのことを試みましたが、パフォーマンスを向上させるものは何もありません。

私のプログラムの以前のバージョンでは、挿入を同時に行っていました(1スレッドあたり〜100スレッド)、それは〜2分かかっていました。バッチ処理はパフォーマンスを10倍向上させるはずだと思っていましたが、逆効果があるようです。

私はこれが私のテーブルのように見えるものであるdb-f1-micro instance

Google Cloud's MySQLを使用しています(DB内のテーブルのみ!):

CREATE TABLE `categories` (
`browse_node` varchar(60) NOT NULL, 
`name` varchar(60) DEFAULT NULL, 
`path` varchar(400) DEFAULT NULL, 
`url` varchar(200) NOT NULL, 
`level` int(11) NOT NULL, 
PRIMARY KEY (`browse_node`) 
) 

これはPOJOです:

package example.com; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

/** 
* Represents a category from the categories table 
*/ 
@Entity 
@Table(name = "categories") 
public class Category { 

    @Id 
    @Column(name = "browse_node") 
    private String browseNode; 
    @Column(name = "name") 
    private String name; 
    @Column(name = "path") 
    private String path; 
    @Column(name = "url") 
    private String url; 
    @Column(name = "level") 
    private int level; 

    public Category() { 

    } 

    public Category(String browseNode, String name, String path, String url, int level) { 
     this.browseNode = browseNode; 
     this.name = name; 
     this.path = path; 
     this.url = url; 
     this.level = level; 
    } 
    // Omitting setters/getters 
} 

挿入を行うコードは次のとおりです。

private static void writeCategoriesToDb(Map<String, Category> categories) { 
    StatelessSession session = sessionFactory.openStatelessSession(); 
    // Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 

    int i = 0; 
    int batchSize = 50; 

    for (Category category : categories.values()) { 
     session.insert(category); 
//  if (i % batchSize == 0) { 
//   session.flush(); 
//   session.clear(); 
//  } 
//  i++; 
    } 

    session.getTransaction().commit(); 
    session.close(); 
} 

そしてここでは、設定ファイルです:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 

     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://someIp/myDB</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">password</property> 
     <property name="connection.useSSL">false</property> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">20</property> 
     <property name="hibernate.jdbc.batch_size">3000</property> 
     <property name="hibernate.id.new_generator_mappings">false</property> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <mapping class="example.com.Category"/> 
    </session-factory> 
</hibernate-configuration> 

答えて

6

それを修正私のJDBC URLにrewriteBatchedStatements=trueを追加answer here.

を発見!

すべてのレコードを挿入するのに約2.2秒かかります。

<property name="connection.url">jdbc:mysql://someIp/myDB?rewriteBatchedStatements=true</property> 
+0

素晴らしい - 将来のGoogle社員を表示するには、パイプをクリックして回答を受け入れることが重要です。この質問にはすでに回答済みです。 – peterh

関連する問題