`

hibernate调用oracle存储过程 处理大数量的方法

 
阅读更多

解决一个上周很郁闷的问题:

项目中有一个需求,一个表 数据量很大,有几百万条吧,保守估计,呵呵。页面上填入 每组 要显示的个数,租用时间(以秒为单位),逻辑就是我先分组,然后循环 每组里根据填入的个数查询出相应的数据,这些数据要写入到xml里,然后更新。

只用java+sql,就是那种最普通的方式,测试之后发现查询+更新需要18分钟完成100000条记录的操作,这根本不能满足需求。

还是请教一下别人哈,得到的答案是 在Oracle里写存储过程,我测了一下,确实快了不少。呵呵,就用它了。

先看 存储过程怎么写吧!

思路就是先分组,然后根据分组 每组再查询出用户要求的个数,放到一个临时表里,然后更新这些数据,最后查询出临时表里的数据返回一个游标。(注:临时表的创建放在command window 里执行)

create or replace procedure updatePro(returndataCur out IPINFO_PACKAGE.curList,curTime in number,endTime in number,dateTime in number,num in number) is
authId number;

--声明变量
pro VARCHAR2(32);
ipInfoId number;
info_ip number;
maskLen number;
portStart number;
portEnd number;
direct number;
rownumber number;
str varchar2(300);
cnt int;
Cursor groupCur is select auth_id,property  from ip_info group by property,auth_id;
Cursor curListCur is select id,ip,mask_len,port_start,port_end,dir,property,auth_id from (select t.*,rownum rn from (select id,ip,mask_len,port_start,port_end,dir,property,auth_id from ip_info ip_info where USABLE_TIME_START + dateTime  < =  endTime  and  USABLE_TIME_END + dateTime  > =  endTime  and NEXT_USE_TIME <  curTime and property=pro and auth_id=authId  order by id desc) t where rownum < = num ) s where rn> 0;
   
 begin

--赋值
authId:=0;
pro:='m';
ipInfoId:=0;
info_ip:=0;
maskLen:=0;
portStart:=0;
portEnd:=0;
direct:=0;
rownumber:=0;
cnt:=0;
str:='delete from RETURNDATA';
select count(*) into cnt from all_tables where table_name='RETURNDATA';
--if cnt!=0 then
--execute immediate str;
--end if;
 --此处是游标嵌套
open groupCur;
loop
fetch groupCur into authId,pro;
exit when groupCur%notfound;
     --dbms_output.put_line(authId||pro);

    open curListCur;  
    loop
   
      fetch curListCur into ipInfoId,info_ip,maskLen,portStart,portEnd,direct,pro,authId;
      exit when curListCur%notfound;
           dbms_output.put_line(ipInfoId);
           insert into RETURNDATA values(ipInfoId,info_ip,maskLen,portStart,portEnd,direct,pro,authId);
           update ip_info set last_use_time=curTime,next_use_time=endTime where id=ipInfoId;
         
      end loop;
      commit;
     
      close curListCur;
end loop;

close groupCur;
open returndataCur for select * from RETURNDATA;
end updatePro;

 

 

hibernate里调用存储过程

public List findAllIpInfoList(Long curTime,Long tempNum,Long dateTime,Integer number) {
ResultSet rs=null;
Session ses = this.getHibernateTemplate().getSessionFactory().openSession(); 
List ipInfoList=new ArrayList();
    try{   
        Connection conn = ses.connection();       
        conn.setAutoCommit(false);   
        String proc="{Call updatepro(?,?,?,?,?)}";   
        CallableStatement st = conn.prepareCall(proc);
        st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);//输出参数
        st.setInt(2,Integer.valueOf(curTime.toString()));
        st.setInt(3,Integer.valueOf(tempNum.toString()));
        st.setInt(4,Integer.valueOf(dateTime.toString()));
        st.setInt(5,number);
       
        st.execute();
        rs = (ResultSet) st.getObject(1);
        while(rs.next())

        { IpInfo ipInfo=new IpInfo();
         ipInfo.setIpinfoIpString(PublicClass.getJustIp(rs.getString(2)));
         ipInfo.setMaskLin(rs.getInt(3));
         ipInfo.setPortStart(rs.getInt(4));
         ipInfo.setPortEnd(rs.getInt(5));
         ipInfo.setDir(rs.getInt(6));
         ipInfo.setProperty(rs.getString(7));
         ipInfo.setAuthId(rs.getInt(8));
          
         ipInfoList.add(ipInfo);
         //System.out.println("<tr><td>" +rs.getLong(2)+"</td><td>"+ rs.getInt(3)+rs.getInt(4)+rs.getInt(5)+rs.getInt(6)+rs.getString(7)+rs.getInt(8)+"</td><td>");
        }
       
        conn.commit();
        st.close();
        conn.close();
        ses.close();
      
    }catch(Exception e){   
        e.printStackTrace();   
    }
return ipInfoList;     
}

分享到:
评论

相关推荐

    hibernate query调用oracle存储过程

    使用hibernate的query调用oracle的存储过程/function,包含例子,源码以及数据库文件

    使用hibernate调用oracle的存储过程

    在hibernate中调用oracle中的存储过程的详细代码。可以借鉴使用,帮助学习。

    Hibernate存储过程的调用

    也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程。

    自学oracle存储过程

    6. Hibernate 调用 Oracle 存储过程..................................................................................... 6 用 Java 调用 Oracle 存储过程总结..................................................

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    Hibernate注解

    * 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY * 例:@GeneratedValue(generator = ...

    千方百计笔试题大全

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    java面试宝典

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    Java面试宝典2020修订版V1.0.1.doc

    19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...

    java面试题

    Java 软件工程师面试资料大整合 1 Java 面霸 1 1. int 和 Integer 有什么区别? 8 2. String 和StringBuffer的区别 8 3. 运行时异常与一般异常有何异同? 8 4. 说出ArrayList,Vector,LinkedList的存储性能和特性 8 5...

    火炬博客系统7

    Hibernate用来作持久层部分和域模型层部分,负责存储、更新、删除、查询数据库记录等,用来作DAO处理,本系统使用Spring整合Hibernate,spring为Hibernate的session提供了有效的容易和安全的控制,Spring控制...

    火炬博客系统6

    Hibernate用来作持久层部分和域模型层部分,负责存储、更新、删除、查询数据库记录等,用来作DAO处理,本系统使用Spring整合Hibernate,spring为Hibernate的session提供了有效的容易和安全的控制,Spring控制...

    jdbc基础和参考

    1.DriverManager(中的getConnection其实也是调用的Driver.connect方法) getConnection(url);//没有用户名密码 //将用户名密码存放在java.util.Properties对象中 getConnection(url,properties); get...

    java开源包1

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    BOS 技术整理

    @Temporal 控制数据表保存日期哪个部分(日期、时间、日期时间) @OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @...

    flex_src.rar_flex

    使用MyEclipse 8.0和Oracle为主要开发工具。前台部分基于Flex技术,应用ActionScript来编写前台代码,主要接受用户的请求并委派...在数据管理方面,采用Hibernate框架,使用Oracle数据库实现对数据的有效存储和查询。

    二十一道面试程序.txt

    8. 写出Oracle增删改查的存储过程,并在java中调用。 9. 用ajax技术实现一个级联菜单功能。 10.写出插入法进行排序代码。 11.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是...

    最新Java面试宝典pdf版

    22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决...

    Java面试宝典2010版

    22、用JDBC如何调用存储过程 23、JDBC中的PreparedStatement相比Statement的好处 24. 写一个用jdbc连接并访问oracle数据的程序代码 25、Class.forName的作用?为什么要用? 26、大数据量下的分页解决方法。 27、用...

    Java面试笔试资料大全

    22、用JDBC如何调用存储过程 109 23、JDBC中的PreparedStatement相比Statement的好处 110 24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决...

Global site tag (gtag.js) - Google Analytics