When using hibernate to insert data into the database, I found that only a portion of the more than 2,000 pieces of data could be inserted into the database. When debugging, I found that the object was indeed created in the loop and save()
was called. The
of the method is as follows
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();
My configuration file is as follows
` <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<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>
</hibernate-configuration> `
Although no out-of-memory exception was thrown, during the search it was found that it might be due to a hibernate cache problem, so a code block that forced refresh every 20 lines was added, but in the end it was found that it still had no effect. Insert The operation can still only be performed partially. Is there any possible reason?
hibernate has been set to show_sql. Is the number of sql printed consistent with the number of excel data?