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