请求:ASP.NET大数据量导入数据库解决方案!

fds2003 2006-12-03 11:48:43
现在有2台服务器,一台是WEB服务器A,一台是数据库服务器B,现在要需要从客户端进行大数据量导入B,数据的格式都是文本格式,内容格式都是这么样的:
13253721911
13253721911
13213387073
13213387073
13213387073
13130988151
每次导入的数据量30W到50W行,文本大小是6.5M。论坛上所说的方案我都都试过了:1,采用DataSet一次更新,2,采用存储过程,3,采用事务机制,但是都不理想,数据很慢。
请求各位帮忙!!
分不够可以再加!!
...全文
735 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangtu86 2006-12-04
  • 打赏
  • 举报
回复
up
yan63 2006-12-04
  • 打赏
  • 举报
回复
所以我无法采用DataReader来快速读取数据源。

--------------------------------------------
txt文件可以作为数据源,由command.excuteReader()获得reader:
http://community.csdn.net/Expert/topic/5202/5202404.xml?temp=7.804507E-02

如果文件格式规范,入库逻辑简单,还是用bcp或dts运行效率好一些,不过开发的效率就低了倒是,bcp和dts导入基于二进制的块,可以提供表级锁提高吞吐,搂主可以直接到企业管理器下做个测试
HJS1820 2006-12-04
  • 打赏
  • 举报
回复
寫存儲程序 參數@kqwd 文件名
--讀取資料
select @sqlstr="bulk insert [#skjl_temp] from 'D:\\kqdat\\"+ltrim(rtrim(@kqwd))+".TXT' with ( datafiletype = 'CHAR', fieldterminator = ' \n' )"
--print @sqlstr
exec(@sqlstr)
levin9 2006-12-04
  • 打赏
  • 举报
回复
我們的思路同21aspnet(清清月儿) 類似,讀到dataSet中。
不過我們一般都有邏輯,存在該記錄,該怎楊操作。不存在該怎楊操作。
21aspnet(清清月儿) 如果一次執行20條或者更多insert語句,速度將有很大的提升。
一般來說,我們1秒種可以導入2000條記錄。
wengnet 2006-12-04
  • 打赏
  • 举报
回复
不过,楼主可以考虑异步插入数据库,用消息队列。
wengnet 2006-12-04
  • 打赏
  • 举报
回复
TO insiderc
你的方法好像有问题,不要试图把TimeOut设置的长一些,当用户数量激增的时候,小心数据库崩溃。
belldandy11 2006-12-04
  • 打赏
  • 举报
回复
学习
test33 2006-12-04
  • 打赏
  • 举报
回复
DATASET XML```
yan63 2006-12-03
  • 打赏
  • 举报
回复
使用dbms自带的批量导入功能,
sql可以使用dts或bcp命令行,oracle可以使用sqlldr,效率还是比较令人满意的
但是如果导入是有比较复杂的逻辑就不太合适
vbman2003 2006-12-03
  • 打赏
  • 举报
回复
有没有试试把文本文件作为数据库来读
fds2003 2006-12-03
  • 打赏
  • 举报
回复
多谢上面的各位回复!
TO 21ASPNET
老兄你导入3W数据花20秒,你采用的方案是采用DataReader读取数据源(你的数据源是数据库),我的文本,所以我无法采用DataReader来快速读取数据源。
有什么办法能提高插入速度的或者读取数据源速度的?
  • 打赏
  • 举报
回复
如果要特意批量导入数据,就不能允许查询和多用户操作。此时可以:

1. 独占数据表。关键!此时可以让原始数据的备份可读,但是不能被修改。
2. 删除所有的索引和触发器、约束。
3. insert数据。
4. 创建索引和所有约束、触发器。
5. 解除独占,允许正常多用户使用。


导入大批量数据的时候,关键是要避免任何查询操作,没有查询比有查询动作的导入会快几百倍。
xiaohuasz 2006-12-03
  • 打赏
  • 举报
回复
新建一存储过程,依此执行下面语句

BULK INSERT temp FROM 'd:\\xxx.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) // 批量导入临时表
INSERT INTO test(phone, indate) SELECT phone, GETDATE() AS indate FROM temp
//从临时表取数据插入最终表
TRUNCATE TABLE temp
//清空临时表

fds2003 2006-12-03
  • 打赏
  • 举报
回复
我先从文本里读去出来内容保存到ArrayList中
---------
private ArrayList GetTxtContent()
{
string mPath=Server.MapPath("temp/");
string strPath;
string filePath=fileUp.PostedFile.FileName;
string mFileName=filePath.Substring(filePath.LastIndexOf("\\")+1);
strPath=mPath + mFileName;
fileUp.PostedFile.SaveAs(strPath);

StreamReader objReader = new StreamReader(strPath);
string sLine="";
ArrayList arrText = new ArrayList();
int i=0;
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
{
arrText.Add(sLine);
i++;
}
}
objReader.Close();
try
{
System.IO.File.Delete(strPath);
}
catch
{

}
return arrText;
}

各位但是随后读ArrayList里面的内容,发觉速度比较慢!
随后我改为读取文本的时候边读去文本边插入数据,但是还是老问题
string mPath=Server.MapPath("temp/");
string strPath;
string filePath=fileUp.PostedFile.FileName;
string mFileName=filePath.Substring(filePath.LastIndexOf("\\")+1);//取得文件名
strPath=mPath + mFileName;
fileUp.PostedFile.SaveAs(strPath);
string sLine="";
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[serverinfo]);
SqlCommand sqlCmd=new SqlCommand();
sqlCmd.Connection=conn;
conn.Open();
string sqlString=null;
using(StreamReader sr=new StreamReader(strPath))
{
while ((sLine = sr.ReadLine()) != null)
{
sqlString=string.Format("insert into test(phone,indate) values({0},getdate())",sLine.ToString());
sqlCmd.CommandText=sqlString;
sqlCmd.ExecuteNonQuery();
}
}
Radar2006 2006-12-03
  • 打赏
  • 举报
回复
mark
yan63 2006-12-03
  • 打赏
  • 举报
回复
bcp:http://www.hackhome.com/2006/4-12/01134449730.shtml
dts:http://www.xue5.com/itedu/8215.html
fds2003 2006-12-03
  • 打赏
  • 举报
回复
我曾想过每次3W地导入,但是如果客户数据多话,那么不是要用户操作十几次?好像有不合要求!
fds2003 2006-12-03
  • 打赏
  • 举报
回复
谢谢各位的答复!!
TO insiderc
你的“通过内存的数据生成arraylist的sql脚本”是怎么样的?你插入30W行数据花多少时间呀?
我的问题是2台服务器,他们都是通过远程访问的,如果WEB服务器和数据库服务器都是在一起有可能会快点。

请大家继续讨论,不够分继续加!
insiderc 2006-12-03
  • 打赏
  • 举报
回复
这个办法虽然较笨,但绝对可以达到客户的要求
insiderc 2006-12-03
  • 打赏
  • 举报
回复
我的一个文本文件还10M咧:
1从文件里解析出数据放在内存里;
2通过内存的数据生成arraylist的sql脚本,
3 执行事务,进行插入到数据库,这一步要较长的时间,你只能要客户等,同时在界面上蔽掉操作,后台timeout设置长些
加载更多回复(4)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧