Maison > Questions et réponses > le corps du texte
Lors de l'utilisation de la mise en veille prolongée pour insérer des données dans la base de données, j'ai constaté que seule une partie du total de plus de 2 000 données pouvait être insérée dans la base de données. Lors du débogage, j'ai constaté que l'objet était effectivement créé dans la boucle et le. save()
La méthode a été appelée
Mon code est le suivant
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String file = "src/1.xlsx";
InputStream is = null;
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
XSSFWorkbook xssfWorkbook = null;
try {
xssfWorkbook = new XSSFWorkbook(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 获取每一个工作薄
for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
if (xssfSheet == null) {
continue;
}
// 获取当前工作薄的每一行
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow != null) {
XSSFCell one = xssfRow.getCell(0);
XSSFCell two = xssfRow.getCell(1);
XSSFCell three = xssfRow.getCell(2);
String name = getValue(three);
String code;
if (getValue(one).equals("沪市"))
code = "sh" + getValue(two);
else
code = "sz" + getValue(two);
StockName2Code s = new StockName2Code();
s.setCode(code);
s.setName(name);
session.save(s);
if (rowNum % 20 == 0) {
session.flush();
session.clear();
}
}
}
}
tx.commit();
session.close();
sessionFactory.close();
Mon fichier de configuration est le suivant
` <!DOCTYPE configuration de mise en veille prolongée PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<configuration d'hibernation>
<session-factory>
<!-- Database connection settings -->
<!-- 表示使用 mysql 数据库驱动类 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- jdbc 的连接 url 和数据库 -->
<property name="connection.url">jdbc:mysql://*******/******?useUnicode=true&characterEncoding=UTF-8</property>
<!-- 数据库用户名 -->
<property name="connection.username">root</property>
<!-- 密码(这里为空) -->
<property name="connection.password">********</property>
<!-- JDBC connection pool (use the built-in) -->
<!-- <property name="connection.pool_size">1</property> -->
<!-- 数据库使用的方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- Echo all executed SQL to stdout -->
<!-- 设置 打印输出 sql 语句 为真 -->
<property name="show_sql">true</property>
<!-- 设置格式为 sql -->
<property name="format_sql">true</property>
<!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<mapping class="pojo.StockName2Code" />
</session-factory>
</configuration d'hibernation> `
Bien qu'aucune exception de mémoire insuffisante n'ait été levée, lors de la recherche, j'ai découvert que cela pouvait être dû à un problème de cache de mise en veille prolongée. J'ai donc ajouté un bloc de code qui forçait l'actualisation tous les 20 éléments, mais à la fin, j'ai trouvé qu'il restait n'a eu aucun effet, et l'opération d'insertion, je ne peux toujours en faire qu'une partie, y a-t-il une raison possible ?
世界只因有你2017-05-17 10:01:07
hibernate a été défini sur show_sql. Le nombre de SQL imprimés est-il cohérent avec le nombre de données Excel
?