2016-08-24 119 views
0

我從Hibernate插入2500條記錄到一個完全空的MySQL表中。插入需要5分鐘!Hibernate + MySQL簡單批量插入極其緩慢

我已經搜索了幾個小時,並嘗試了一些東西,如自動生成的主鍵,但似乎沒有提高性能。

我的程序的早期版本是在同時插入(每線程約1個線程約100個線程),並花費了大約2分鐘。我認爲配料應該將性能提高10倍左右,但它似乎已經不起作用。

我使用Google Cloud's MySQLdb-f1-micro instance

這是我的表看起來像(僅在數據庫表!):

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

找到了answer here.

添加rewriteBatchedStatements=true我的JDBC網址定了!

現在需要〜2.2秒來插入所有記錄。

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

很好 - 重要的是通過點擊管道來接受您的答案,以顯示未來的谷歌,這個問題已經得到了回答。 – peterh