如何直接往系统中数据库系统表插入数据

当前位置: &
把数据插入到数据库的两种方法
15:24:53 来源: 本站整理
把表单中的数据插入到数据库中有两种方法。1.直接使用sql语句的
优点:速度快,不耗资源
缺点:不能传递太长的字段内容,字段比较多时不易排错。
推荐有经验的编程者优先考虑.
具体操作:
假设表单中有以下字段:username,password,sex,age
对应的,在程序中有username,password,sex,age已取通过request.form或request.querystring取到字段的值。
数据库表user中有username,password,sex,age字段。其它age为数字字段.
已经建立connection对象,并打开链接.
sql=&insert into [user] (username,password,sex,age) value ('&&username&&','&&password&&','&&sex&&',&&age&&)&
conn.execute(sql)
值得注意的是,如果username中含有“'”单引号,则会出错,解决方法是把字符串函数先经过处理.我常用的方法是建立一个sqlencode函数。
function sqlencode(str)
sqlencode=&'&&replace(str,&'&,&''&)&&'&
end function
这样上面的sql 语名在可以简化为sql=&insert into [user] (username,password,sex,age) values (&&sqlencode(username)&&,&&sqlencode(password)&&,&&sqlencode(sex)&&,&&age&&)&
多字段时注意前面列表中的字段名和 values后面的值的顺序要注意一一对应关系,如果该值为空,可以不填写,但表示分隔的“,”号不能省略。
加入的字段为字符串字段时要注意给内容前后加上&'&号。
另外,在表名user上面打上方括号是因为user表可能是一个系统表,打上方括号才不会和系统有冲突。给表名加上方括也是保证代码的兼容性的一个良好习惯。2.使用recordset对象
优点:代码容易阅读,除错
缺点:消耗系统资源
推荐新手使用
环境同上代码如下:
set rs=Server.CreateObejct(&ADODB.Recordset&)
sql=&select * from [user]
rs.open sql,conn,2,3
'注意这一行为新加入一个记录,如果漏掉,就会改以前的记录了。
rs(&username&)=username
rs(&password&)=password
rs(&sex&)=sex
rs(&age&)=age
'将更新写入数据库中
'最快的关闭recordset对象是一种良好的习惯
set rs=nothing
'将不用的对象释放也是一种良好的习惯
本文来源于阿里西西WEB开发社区收集整理,欢迎访问。
您还没登陆呢,点这里共有 & 位网友发表了看法&&查看: 48612|回复: 25
Hive四种数据导入方式介绍
主题帖子积分
1.从本地文件系统中通过什么命令可导入数据到Hive表?
2.什么是动态分区插入?
3.该如何实现动态分区插入?
这里可以和进行对比?
Hive的几种常见的数据导入方式
这里介绍四种:
(1)、从本地文件系统中导入数据到Hive表;
(2)、从HDFS上导入数据到Hive表;
(3)、从别的表中查询出相应的数据并导入到Hive表中;
(4)、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。
一、从本地文件系统中导入数据到Hive表
先在Hive里面创建好表,如下:
hive& create table wyp
& & & (id int, name string,
& & & age int, tel string)
& & & ROW FORMAT DELIMITED
& & & FIELDS TERMINATED BY '\t'
& & & STORED AS TEXTFILE;
OK
Time taken: 2.832 seconds复制代码
这个表很简单,只有四个字段,具体含义我就不解释了。本地文件系统里面有个/home/wyp/wyp.txt文件,内容如下:
[wyp@master ~]$ cat wyp.txt
1& && & wyp& &&&25& && &88
2& && & test& & 30& && &88
3& && & zs& && &34& && &复制代码
wyp.txt文件中的数据列之间是使用\t分割的,可以通过下面的语句将这个文件里面的数据导入到wyp表里面,操作如下:
hive& load data local inpath 'wyp.txt'
Copying data from file:/home/wyp/wyp.txt
Copying file: file:/home/wyp/wyp.txt
Loading data to table default.wyp
Table default.wyp stats:
[num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67]
OK
Time taken: 5.967 seconds复制代码
这样就将wyp.txt里面的内容导入到wyp表里面去了,可以到wyp表的数据目录下查看,如下命令:
hive& dfs -ls /user/hive/warehouse/
Found 1 items
-rw-r--r--3 wyp supergroup 67
18:23 /hive/warehouse/wyp/wyp.txt复制代码
需要注意的是:
和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。
二、HDFS上导入数据到Hive表
  从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/wyp/),然后再将数据从那个临时目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里面。既然如此,那么Hive肯定支持将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下,假设有下面这个文件/home/wyp/add.txt,具体的操作如下:
[wyp@master /home/q/hadoop-2.2.0]$ bin/hadoop fs -cat /home/wyp/add.txt
5& && & wyp1& & 23& && &
6& && & wyp2& & 24& && &
7& && & wyp3& & 25& && &
8& && & wyp4& & 26& && &复制代码
上面是需要插入数据的内容,这个文件是存放在HDFS上/home/wyp目录(和一中提到的不同,一中提到的文件是存放在本地文件系统上)里面,我们可以通过下面的命令将这个文件里面的内容导入到Hive表中,具体操作如下:
hive& load data inpath '/home/wyp/add.txt'
Loading data to table default.wyp
Table default.wyp stats:
[num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215]
OK
Time taken: 0.47 seconds
hive& select *
OK
5& && & wyp1& & 23& && &
6& && & wyp2& & 24& && &
7& && & wyp3& & 25& && &
8& && & wyp4& & 26& && &
1& && & wyp& &&&25& && &88
2& && & test& & 30& && &88
3& && & zs& && &34& && &
Time taken: 0.096 seconds, Fetched: 7 row(s)复制代码
从上面的执行结果我们可以看到,数据的确导入到wyp表中了!请注意load data inpath ‘/home/wyp/add.txt’里面是没有local这个单词的,这个是和一中的区别。
三、从别的表中查询出相应的数据并导入到Hive表中
假设Hive中有test表,其建表语句如下所示:
hive& create table test(
& & & id int, name string
& & & ,tel string)
& & & partitioned by
& & & (age int)
& & & ROW FORMAT DELIMITED
& & & FIELDS TERMINATED BY '\t'
& & & STORED AS TEXTFILE;
OK
Time taken: 0.261 seconds复制代码
大体和wyp表的建表语句类似,只不过test表里面用age作为了分区字段。对于分区,这里在做解释一下:
分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如wyp表有dt和city两个分区,则对应dt=,city=BJ对应表的目录为/user/hive/warehouse/dt=/city=BJ,所有属于这个分区的数据都存放在这个目录中。
下面语句就是将wyp表中的查询结果并插入到test表中:
hive& insert into table test
& & & partition (age='25')
& & & select id, name, tel
& & &
#####################################################################
& && && &&&这里输出了一堆Mapreduce任务信息,这里省略
#####################################################################
Total MapReduce CPU Time Spent: 1 seconds 310 msec
OK
Time taken: 19.125 seconds
hive& select *
OK
5& && & wyp1& & & & 25
6& && & wyp2& & & & 25
7& && & wyp3& & & & 25
8& && & wyp4& & & & 25
1& && & wyp& &&&88&&25
2& && & test& & 88&&25
3& && & zs& && && && & 25
Time taken: 0.126 seconds, Fetched: 7 row(s)复制代码这里做一下说明:
我们知道我们传统数据块的形式insert into table values(字段1,字段2),这种形式hive是不支持的。
通过上面的输出,我们可以看到从wyp表中查询出来的东西已经成功插入到test表中去了!如果目标表(test)中不存在分区字段,可以去掉partition (age=’25′)语句。当然,我们也可以在select语句里面通过使用分区值来动态指明分区:
hive& set hive.exec.dynamic.partition.mode=
hive& insert into table test
& & & partition (age)
& & & select id, name,
& & & tel, age
& & &
#####################################################################
& && && &&&这里输出了一堆Mapreduce任务信息,这里省略
#####################################################################
Total MapReduce CPU Time Spent: 1 seconds 510 msec
OK
Time taken: 17.712 seconds
hive& select *
OK
5& && & wyp1& & & & 23
6& && & wyp2& & & & 24
7& && & wyp3& & & & 25
1& && & wyp& &&&88&&25
8& && & wyp4& & & & 26
2& && & test& & 88&&30
3& && & zs& && && && & 34
Time taken: 0.399 seconds, Fetched: 7 row(s)复制代码
这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为nonstrict。当然,Hive也支持insert overwrite方式来插入数据,从字面我们就可以看出,overwrite是覆盖的意思,是的,执行完这条语句的时候,相应数据目录下的数据将会被覆盖!而insert into则不会,注意两者之间的区别。例子如下:
hive& insert overwrite table test
& & & PARTITION (age)
& & & select id, name, tel, age
& & &复制代码
更可喜的是,Hive还支持多表插入,什么意思呢?在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:
hive& show create table test3;
OK
CREATE&&TABLE test3(
&&id int,
&&name string)
Time taken: 0.277 seconds, Fetched: 18 row(s)
hive& from wyp
& & & insert into table test
& & & partition(age)
& & & select id, name, tel, age
& & & insert into table test3
& & & select id, name
& & & where age&25;
hive& select * from test3;
OK
8& && & wyp4
2& && & test
3& && & zs
Time taken: 4.308 seconds, Fetched: 3 row(s)复制代码
可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出。这个很酷吧!
四、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
hive& create table test4
& & & as
& & & select id, name, tel
& & &
hive& select * from test4;
OK
5& && & wyp1& &
6& && & wyp2& &
7& && & wyp3& &
8& && & wyp4& &
1& && & wyp& &&&88
2& && & test& & 88
3& && & zs& && &
Time taken: 0.089 seconds, Fetched: 7 row(s)复制代码
数据就插入到test4表中去了,CTAS操作是原子的,因此如果select查询由于某种原因而失败,新表是不会创建的!
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
注册会员, 积分 180, 距离下一级还需 20 积分
注册会员, 积分 180, 距离下一级还需 20 积分
总结的非常好,非常好的帖子
主题帖子积分
注册会员, 积分 77, 距离下一级还需 123 积分
注册会员, 积分 77, 距离下一级还需 123 积分
主题帖子积分
中级会员, 积分 517, 距离下一级还需 483 积分
中级会员, 积分 517, 距离下一级还需 483 积分
那公司实际业务中是不是主要通过java代码批量向hive中导入数据,还是少量长时间累加的向hive导入数据
主题帖子积分
那公司实际业务中是不是主要通过java代码批量向hive中导入数据,还是少量长时间累加的向hive导入数据Java是实现方式,如同我们传统数据库中,sql可以插入数据,通过程序调用sql也可以插入数据。所以Java可以插入hive,sql也可以,至于什么方式,看你的需求。如果想使用起来更加的方便,当然是通过程序一键实现,这是很多人都喜欢的
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
中级会员, 积分 517, 距离下一级还需 483 积分
中级会员, 积分 517, 距离下一级还需 483 积分
Java是实现方式,如同我们传统数据库中,sql可以插入数据,通过程序调用sql也可以插入数据。所以Java可以 ...
谢谢pig2回复,回复很快,很感谢
主题帖子积分
高级会员, 积分 1341, 距离下一级还需 3659 积分
高级会员, 积分 1341, 距离下一级还需 3659 积分
路过,学习学习
主题帖子积分
高级会员, 积分 1154, 距离下一级还需 3846 积分
高级会员, 积分 1154, 距离下一级还需 3846 积分
主题帖子积分
高级会员, 积分 1147, 距离下一级还需 3853 积分
高级会员, 积分 1147, 距离下一级还需 3853 积分
多谢楼主分享!!!!
主题帖子积分
中级会员, 积分 852, 距离下一级还需 148 积分
中级会员, 积分 852, 距离下一级还需 148 积分
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
活跃且尽责职守的版主
为论坛做出突出贡献的会员
积极上进,爱好学习
站长推荐 /4
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
等待验证会员请验证邮箱
新手获取积分方法
技术类问答,解决学习openstack,hadoop生态系统中遇到的问题
Powered by4-插入数据_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
4-插入数据
上传于|0|0|文档简介
&&MySQL数据库资料
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢1869人阅读
Oracle(26)
hibernate(30)
Hibernate批处理操作优化&(批量插入、更新与删除)
我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低。
工作所需,我经常要写些程序批量处理数据,每次执行几十万数据处理的时候,我机子的CPU都会飙高,而且数据处理速度会越来越慢。比如第一个1W条要5分钟,第二个1W条就要10分钟,要干其他事情的时候机子也卡的不行,只能等着处理完数据。
其实我一直认为是数据量太大,从来不认为是程序问题,所以一直没怎么关注过。这次问题浮上表面,所以要好好解决下!
主要原因:Hibernate的一级缓存影响。
我们每次保存的东西都会保存在Session缓存中,这就是Hibernate的一级缓存,如果我们一直循环执行save等操作,缓存里东西会越来越多,速度也就越来越慢,服务器一直在循环处理,自然也会增加负载。
这本来就是Hibernate不擅长的地方,而且一级缓存不可以不用,如果我们要保存的数据量十分巨大,那么在程序中执行添加、更新方法时,Session对象自身开辟的一级缓存会不断消耗,直至OutOfMemoryError (内存溢出异常)。
这就需要我们管理好Hibernate的缓存,或者不使用Hibernate。
批量插入优化
1、仍旧用Hibernate API来进行批处理,但在一定的量的时候,及时的清除缓存。
1)优化Hibernate,在配置文件中设置hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量。 配置hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,hibernate.jdbc.batch_size参数值越大,读数据库的次数越少,速度越快。
name=&hibernate.jdbc.batch_size&&50
2)程序及时清除缓存,即每插入一定量的数据后及时把它们从内部缓存中清除掉,释放占用的内存。 Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。
示例代码:
// 每处理50条清空缓存
session.save(myObject);
if (i/50 == 0) {
session.flush();
session.clear();
// 在我的项目中写法如下:
if (i/50 == 0) {
this.getHibernateTemplate().flush();
this.getHibernateTemplate().clear();
2、通过JDBC API来做批量插入,绕过Hibernate API。这个方法性能上是最好的,也是最快的。
示例代码:
String insertSql = &insert into user(name,address) values(?,?)&;
Session session = getHibernateTemplate().getSessionFactory().openSession();
Connection conn = session.connection();
PrepareStatement stmt = conn.prepareStatement(insertSql);
// 方式1:自动提交
conn.setAutoCommit(true);
for(int i = 0; i++; i&&/span&10000) {
stmt.setString(1, &testName&);
stmt.setString(2, &testAddress&);
stmt.execute();
// 方式2:批量提交
conn.setAutoCommit(false);
for(int i = 0; i++; i&&/span&10000) {
stmt.setString(1, &testName&);
stmt.setString(2, &testAddress&);
stmt.addBatch();
if (i % 100 == 0) {
stmt.executeBatch();
conn.commit();
stmt.executeBatch();
conn.commit();
// 关闭session
session.close();
附测试数据:
// 测试方法:循环插入10000条数据,拆分10页,每页1000条。
// 直接Hibernate的save()方法,不做任何处理。
page 0 process time : 5925
page 1 process time : 6722
page 2 process time : 8019
page 3 process time : 9456
page 4 process time : 10263
page 5 process time : 11511
page 6 process time : 12988
page 7 process time : 13969
page 8 process time : 15196
page 9 process time : 16820
// Hibernate的save()方法,但每1个清除缓存。
page 0 process time : 10257
page 1 process time : 10709
page 2 process time : 11223
page 3 process time : 10595
page 4 process time : 10990
page 5 process time : 10222
page 6 process time : 10453
page 7 process time : 10196
page 8 process time : 9645
page 9 process time : 10295
// Hibernate的save()方法,但每50个清除缓存。
page 0 process time : 5848
page 1 process time : 5480
page 2 process time : 5739
page 3 process time : 5960
page 4 process time : 6287
page 5 process time : 5947
page 6 process time : 7012
page 7 process time : 6235
page 8 process time : 6063
page 9 process time : 6055
// JDBC的auto commit 方式
page 0 process time : 840
page 1 process time : 800
page 2 process time : 800
page 3 process time : 847
page 4 process time : 806
page 5 process time : 829
page 6 process time : 1042
page 7 process time : 893
page 8 process time : 857
page 9 process time : 854
// JDBC的batch方式,每50个commit
page 0 process time : 827
page 1 process time : 801
page 2 process time : 918
page 3 process time : 828
page 4 process time : 856
page 5 process time : 831
page 6 process time : 815
page 7 process time : 842
page 8 process time : 817
page 9 process time : 937
1)若直接使用Hibernate,处理同样数据的时间会递增,甚至成倍增加,而且在测试过程中CPU使用率一直在70%上下。
2)若在使用Hibernate中每save一次都清空缓存的话,虽然时间不会递增,但处理速度很慢。在本例中采用每50个清空一次缓存较为合适,实际应用视情况而定。 一定量的时候清空缓存,虽然速度上没有提升,但会比较稳定,不会随着时间陡增,而且测试中CPU使用率也维持在20%上下,可以挽救一点性能损失,使系统相对稳定。
3)若使用JDBC API,不论auto commit方式还是batch方式,相比Hibernate在性能上都有近10倍的提升。不过在数据量较大的时候,推荐使用batch方式。
批量更新与删除优化
Hibernate2中,对于批量更新/删除操作,都是先将符合要求的数据查出来,然后再做更新/删除操作。这样一来会占用大量内存,而且海量数据处理的时候性能很低。
而Hibernate3对批量更新/删除提供了支持,能够直接执行批量更新或批量删除语句,无需把被更新或删除的对象先加载到内存中,类似于JDBC的批量更新/删除操作。
不过对于循环处理数据更新和删除场景,建议还是使用JDBC,方法同上:批量插入的方法2。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:466388次
积分:7179
积分:7179
排名:千里之外
原创:278篇
转载:151篇
评论:60条
我的邮箱(#换为@):snailknight#yeah.net
(6)(15)(5)(8)(10)(8)(7)(11)(10)(11)(6)(27)(27)(36)(22)(42)(29)(5)(38)(61)(35)(9)(2)}

我要回帖

更多关于 数据库系统概论 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信