存入1千万条数据,用hibernate存
数据的定义都很简单:
create table testEntity2 ( id varchar(255) not null, description varchar(255), name varchar(255), primary key (id) )
主键生成策略UUID
防止数据过大
设置 <property name="hibernate.jdbc.batch_size">50</property>
同时代码里也是50次 flush一下 clear一下 在eclipse的环境中 内存占用在500M左右
每10w条打印一次 如果不使用batch_size 也不flush和clear 内存会在2G左右
并且也会发生内存溢出的错误:(但前面几次的速度非常可观 到第280万条的时候堆溢出)
但这些只是存在session的缓存里 没有真正uncommit到数据库 所以到底有多快...不好说...
正在插入 1:1 2:2 3:2 4:3 5:3 6:5 7:5 8:7 9:7 10:7 11:8 12:8 13:8 14:11 15:11 16:11 17:12 18:15 19:15 20:15 21:16 22:16 23:17 24:17 25:24 26:28 27:35 28:49 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded at org.hibernate.engine.internal.StatefulPersistenceContext.addEntry(StatefulPersistenceContext.java:539) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:249) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752) at org.cc.data.test.DataGenerator.main(DataGenerator.java:25)
然后分别做一下测试 先把batch_size设置为10 每10次 flush和clear:
正在插入
1:37
2:72
3:108
4:144
.......
1:37
2:72
3:108
4:144
.......
50和100的测试和这个结果也大同小异就不测试了
其他的以后再写了..
代码:
package org.cc.data.test; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name="testEntity2") public class TestEntity { @Id @GenericGenerator(strategy="uuid", name = "uuid") @GeneratedValue(generator="uuid") private String id; @Column(name="name") private String name; @Column(name="description") private String description; public TestEntity(String name, String description) { super(); this.name = name; this.description = description; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
package org.cc.data.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class DataGenerator { public static void main(String[] args) { Configuration cfg = new Configuration().configure(); ServiceRegistry sr = new ServiceRegistryBuilder().applySettings( cfg.getProperties()).buildServiceRegistry(); SessionFactory sf=cfg.buildSessionFactory(sr); Session session=sf.openSession(); Transaction trans=session.beginTransaction(); long timeNow=System.currentTimeMillis(); System.out.println("正在插入"); int count=0; for(int i=0;i<10000000;i++){ TestEntity tes=new TestEntity("cc"+i,"desc:"+i); session.save(tes); ++count; if ((count) % 50 == 0 ) {//100,与JDBC批量设置相同 session.flush(); session.clear(); } if(count%100000 ==0 ){ long timeTemp=System.currentTimeMillis(); System.out.println((count / 100000)+":"+((timeTemp-timeNow)/1000)); } } trans.commit(); session.close(); long timeNow2=System.currentTimeMillis(); System.out.println("time past:"+(timeNow2-timeNow)); } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">密码</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">用户名</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.jdbc.batch_size">50</property> <mapping class="org.cc.data.test.TestEntity"/> </session-factory> </hibernate-configuration>
相关推荐
“串口数据采集入MySQL数据库”软件是传感器网络记录数据的一般工具。最主要核心功能是把串口上接收到的数据,以字符串数据...达到采集串口上获取数据存入MySQL数据库的作用,进而可以使用各种算法和方法处理这些数据。
本文实例讲述了Python3实现的爬虫爬取数据并存入mysql数据库操作。分享给大家供大家参考,具体如下: 爬一个电脑客户端的订单。罗总推荐,抓包工具用的是HttpAnalyzerStdV7,与chrome自带的F12类似。客户端有接单...
VC++捕获用户上网记录和使用程序记录 ,并存入数据库,其中有个Shell Hook是钩子程序,wmi是主程序,数据库用的是Mysql,直接导入结果就行(sql文件),最好在 xp情况下运行,本机测试用的是win7,因此 在捕获数据时,...
钉钉API考勤打卡记录获取并存入数据库(python),免去人数限制
15.6 向关联数据表插入新数据记录 15.7 处理来自HTML表单的输入数据 15.8 分页显示查询结果 15.9 处理层次化数据 15.10 速度优化 15.11 Unicode 15.12 二进制数据(BLOB)和图像 15.13 存储...
ExcelReader 通过创建表从mysql中读取数据并将记录存储在mysql中的Java程序。
这是一个演示项目,它使用 NMAP 扫描端口并在 mysql 数据库中保存历史记录。 该项目是用 Java 7 编写的,使用 Play Framework v2.3.7 和 jQuery 前端,并在 Windows 上开发。 开发笔记 在我的 Windows 8 笔记本电脑...
前台采用 Tensorflow.js 中的 faceapi.js 来实现前端的人脸录入和人脸识别,采用 JavaScript 的多维浮点数组处理矩阵数据存入 MySQL 数据库,同时采用 Thymeleaf 模板引擎进行前后端数据之间的交互。
15.6 向关联数据表插入新数据记录 15.7 处理来自HTML表单的输入数据 15.8 分页显示查询结果 15.9 处理层次化数据 15.10 速度优化 15.11 Unicode 15.12 二进制数据(BLOB)和图像 15.13 存储过程 ...
在导入数据的过程中会碰到一些需要解决的问题,这里结合导入一个大约4G的txt数据的实践,把碰到的问题以及解决方法展现出来,一方面自己做个总结记录,另一方面希望对那些碰到相同问题的朋友有个参考。 我导入的数据...
很不巧公司内测IM的时候又遇到MYSQL_DATA_TRUNCATED错误,日志记录还是在mysql_stmt_fetch调用的时候出现的。鉴于之前的经验,应该是给定的结果集绑定区域长度不够造成的,反复检查了好多遍没发现问题。我在代码中都...
从串口设备读取数据,在软件显示,并支持高低限报警和语音报警,存入MYSQL数据库记录数据,并可以调出趋势曲线,支持报表功能
最近这个需求是 php 接收前端数据,然后将数据存入数据库中,但相同记录不能存入。 查了查百度,都把简单的事情复杂化了,竟然还有先查询数据表再判断插入的方式(大拇指),通通不采纳,后来直接翻阅了 SQL 手册,...
本文设计实现的采集系统通过调用Unix系统函数来读取这个日志文件中的内容,然后对读取到的内容进行整理为方便计费的数据,最后把这些数据存入数据库中。为了使读取的数据量不至于过大,采集系统采用每小时定时执行一...
这个项目有2个爬虫程序和一个网站程序:其中一个爬虫负责分页抓取json格式的数据,分析拿到豆瓣电影的详情页面url地址存入到redis数据库的content_urls集合中;另外一个爬虫负责抓取详情页url的电影内容字段,包括了...
主要介绍了SpringBoot Logback日志记录到数据库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
① 资金收入 新的资金收入做记录,存入钱包或银行 ② 资金支出 新的资金支出做记录,现金支付或刷卡支付 3) 家庭银行 ① 存款 新的资金存入银行 ② 取款 新的资金取出,取出现金存入钱包 4) 资金流动 ① 收入记录 ...
存放Mysql数据变更记录 运河服务器 阿里巴巴/运河,负责Mysql执行日志的获取和解析 运河客户 对接canal-sever,负责将日志解析结果存入influxDB 数据同步原理 服务器端基础数据库日志实现数据库同步 在上图中: ...
介绍一个php高效获取数据分页类,PHP MYSQL数据库基本功能,获取序列ID,获取strSql第N条记录中的第N列数据,下标从1开始,获取strSql第N条记录,获取strSql记录集存入数组中。