oracle   的  sqlldr  导入数据时 , 1. 在java 中 调用  Runtime.getRuntime().exec(sqlLoadSQL); 时 为什么不能立即入库。要停调tomcat 服务后 才能全部入库??并且 日志文件中才生成数据?? 是不是sqlldr   有什么参数控制啊?? 1. 如果 执行 Runtime.getRuntime().exec(sqlLoadSQL) 后 ; 由于某些错误,不能全部入库 只有几百条数据入库; 这时我想回滚 ,该怎么做,, 也就是事务 处理。
急丫 。。

解决方案 »

  1.   

    2|你用sqlldr加载一个1000万记录的数据表,但是加载了多一半的时候你发现有问题,这个时候你想清空表重新加载。那么最好 reuse storage ,这样再次加载就不需要再次寻找空闲空间了。 数据库操作的sql语句: 
      使用方法: 
      truncate table table_name; 
      操作特性: 
      truncate 只删除表中的所有数据,不删除表的结构; 
      truncate 是ddl操作立即生效,原数据不放到rollback segment中,不能回滚.,操作不触发trigger.; 
      truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; 
      truncate 会将高水线复位(回到最开始) 
      

  2.   

    1\要停调tomcat 服务后 才能全部入库??和tomcat没有关系吧 看看是不是程序逻辑有问题
      

  3.   

    sqlLoadSQL设置有提交参数rows,一般默认是64,当插入数据库的条数达到提交条件时,才会提交一次(最后一次不满条件时也会提交),你的插入操作一次插入多少?
      

  4.   


     我 插入 240000 条 64 :错误情况下是 插入 64条 。。
     
    在运行正常的情况下: 运行Runtime.getRuntime().exec(sqlLoadSQL) 只插入836 条 不知道为什么 总是这个 数字 ;我是 这样认为的:1.sqlload 是不是有参数 或缓存 控制。
                     2.插入 是 dml 语句 应该commit 才能提交吧!不解 ??
      

  5.   

    将参数rows=0设置成逐笔提交试一下,如果这样可以说明问题就是这个地方,
    如果每次都是只插入836 条,应该是你的数据格式不正确,看看log文件中的提示(默认与数据文件同一个目录,与ctl文件同名,只是后缀由ctl换成log),里面会有详细的出错说明。
      

  6.   

    导入100万数据:
    1)今天 我也遇到这样的问题: 执行在 sqlldr语句后面 加上direct=true 即可 Process process = r.exec("sqlldr userid=customer/soshare@customer control=bigdata.ctl data=bigdata.csv direct=true ");      
    [经过测试:用时间为: 00: 00: 30.06]
    2)还有跟快的
    Process process = r.exec("sqlldr userid=customer/soshare@customer control=bigdata.ctl data=bigdata.csv direct=true streamsize=10485760");     
    [经过测试:用时间为: 00: 00: 28.19]