JBOSS 7.1 で、Apache POI による読み込みと Hibernate および JPA による永続化 (これは特定の要件であり、JYA データソースを使用します) により、Excel ファイルからデータベースのインポートを高速化しようとしています。ただし、現時点ではインポートが遅すぎます。30,000 レコードの場合、約 3 分かかります。これを約 30 秒に短縮する必要があります。バッチ挿入を設定するためのヘルプを探していますが、presend で試したことはありません..
私のpersistence.xmlは次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="primary" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.default_catalog" value="myDatabase"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.jdbc.fetch_size" value="500"/>
<property name="hibernate.jdbc.batch_size" value="500"/>
<property name="hibernate.default_batch_fetch_size" value="16"/>
<property name="hibernate.connection.release_mode" value="auto"/>
<property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_minimal_puts" value="true"/>
<property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/>
<property name="hibernate.cache.region_prefix" value="services"/>
<property name="hibernate.connection.driver_class" value="com.mysql"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/myDatabase"/>
<property name="hibernate.connection.username" value="root"/>
</properties>
</persistence-unit>
</persistence>
JBOSS の起動時にデプロイする EJB タイマー クラスがあり、これは新しい Excel ファイルを探し、見つかった場合はそれらをデータベースにインポートします - これはすべて正常に動作します - ただ遅いだけです... //Listener Class ());
// This all works ok
}
}
}
}
*これは実際に JPA 経由でファイルを永続化するクラスです *
@Stateless
@LocalBean
public class ExcelReader implements TableDao {
@PersistenceContext
private EntityManager em;
private HSSFRow row = null;
private HSSFWorkbook wb;
private BaseDataTable baseDataTable;
public void loadDatabase(String path)
{
try
{
FileInputStream latestExcelFile = new FileInputStream(path);
wb = new HSSFWorkbook(latestExcelFile);
} catch (Exception ex) {}
importTheTable();
}
public ExcelReader() {}
public void importTheTable(){
HSSFSheet baseDataTableSheet = wb.getSheetAt(0);
for (int i = 1; i <= baseDataTableSheet.getLastRowNum(); i++)
{
row = baseDataTableSheet.getRow(i);
baseDataTable = new BaseDataTable();
try
{
baseDataTable.setDateTime(row.getCell(0).getDateCellValue());
baseDataTable.setEventId((int) row.getCell(1).getNumericCellValue());
baseDataTable.setCauseClass(parseCauseClass(row.getCell(2).toString()));
baseDataTable.setUeType((int) row.getCell(3).getNumericCellValue());
baseDataTable.setMarket((int) row.getCell(4).getNumericCellValue());
baseDataTable.setOperator((int) row.getCell(5).getNumericCellValue());
baseDataTable.setCellId((int) row.getCell(6).getNumericCellValue());
baseDataTable.setDuration((int) row.getCell(7).getNumericCellValue());
baseDataTable.setCauseCode((int) row.getCell(8).getNumericCellValue());
baseDataTable.setNeVersion(row.getCell(9).toString());
baseDataTable.setImsi(row.getCell(10).getNumericCellValue());
baseDataTable.setHier3Id((row.getCell(11).toString()));
baseDataTable.setHier32Id((row.getCell(12).toString()));
baseDataTable.setHier321Id((row.getCell(13).toString()));
addBaseTableEntry(baseDataTable);
} catch (Exception ex) { System.out.println("Error in excel file"); }
if(i%1000 == 0)
{
em.flush();
em.clear();
}
}
}
** これが EntityManager の作成方法です **
@Stateful
@RequestScoped
public class Resources {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
@Produces
public EntityManager getEm() {
return em;
}
}
これはすべて正常に機能しますが、遅すぎます-オンラインで無限に検索し、UserTransactionを適用してインポートを高速化しようとしましたが、役に立ちませんでした.正しい方向への助けをいただければ幸いです.
乾杯