`

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的存储过程和函数,以及提供相关的示例代码和数据库文件。 首先,让我们了解什么是存储过程和函数。存储过程是预编译的SQL语句集合,可以接受参数、...

    使用hibernate调用oracle的存储过程

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

    hibernate 调用oracle函数

    总的来说,Hibernate调用Oracle函数涉及到了数据库设计、ORM框架的使用、原生SQL查询和结果映射等多个方面,熟练掌握这些技能对于开发高质量的企业级应用至关重要。希望这篇文章能帮助你更好地理解和应用这些知识。

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    Java调用oracle存储过程通过游标返回临时表

    调用Oracle存储过程并处理返回的游标(Cursor)在Java中通常涉及以下步骤: 1. **建立数据库连接**:使用JDBC(Java Database Connectivity)驱动,通过`DriverManager.getConnection()`方法建立到Oracle数据库的...

    Spring boot调用Oracle存储过程的两种方式及完整代码

    在解决问题的过程中,我们发现了 Spring Boot 项目中调用 Oracle 存储过程时遇到的问题,即连接池数量默认为 10,导致每次访问数据库后连接未释放。我们可以通过手动关闭 Session 来释放连接,或者使用第一种方式来...

    oracle存储过程学习经典[语法+实例+调用].doc

    - **Hibernate调用Oracle存储过程**:Hibernate框架支持调用存储过程,通过映射配置文件或注解指定存储过程的调用方式。 - **用Java调用Oracle存储过程**:使用`CallableStatement`接口来调用存储过程,设置输入...

    oracle存储过程学习经典

    5. **调用Oracle存储过程**:通过Java或Hibernate等工具调用Oracle存储过程,需要注意参数传递和结果集的处理。 #### 动态SQL与存储过程 在存储过程中执行动态SQL,有两种主要方式: 1. **本地动态SQL**:适用于...

    oracle存储过程学习经典[语法+实例+调用]

    - **Java调用Oracle存储过程**:使用Hibernate框架或纯Java代码可以实现调用Oracle存储过程的功能。 - 无返回值的存储过程调用较为简单。 - 有返回值的存储过程需要特别处理返回值。 - 返回列表的存储过程需通过...

    Oracle PlSql 存储过程

    调用 Oracle 存储过程需要使用 Hibernate 的存储过程调用机制。 七、 用 Java 调用 Oracle 存储过程总结 用 Java 调用 Oracle 存储过程可以使用 JDBC 或 Oracle 的java驱动程序。下面是用 Java 调用 Oracle 存储...

    Hibernate3调用存储过程用法

    Hibernate3通过Query对象的createSQLQuery方法提供对存储过程的调用支持。它允许我们编写原生的SQL语句,包括调用存储过程,然后映射结果到Java对象。 三、具体步骤 1. **创建SQL查询** 使用Session的...

    oracle 存储过程学习经典

    #### 八、Java调用Oracle存储过程 - **无返回值的存储过程**: 可以直接调用存储过程,无需关注返回值。 - **有返回值的存储过程**: - 非列表返回: 通常使用简单的数据类型作为返回值。 - 列表返回: 使用游标或...

    HIbernate与oracle数据库应用例子

    它支持大规模数据存储,并且有丰富的功能,适合企业级应用。 三、Hibernate与Oracle的集成 1. 配置Hibernate - `hibernate.cfg.xml`配置文件:在其中设置Oracle数据库的相关参数,包括JDBC驱动类、URL、用户名和...

    Hibernata调用Oracle数据库存储过程的一个小例子

    总结来说,通过Hibernate调用Oracle数据库的存储过程涉及配置数据库连接、定义Java类和接口、注解指定存储过程,以及在服务类中执行调用。这个过程既体现了Hibernate的灵活性,也展示了其在复杂数据库操作中的实用性...

    Hibernate存储过程的调用

    #### 三、Hibernate调用存储过程的方法 在Hibernate中调用存储过程通常有两种方式:通过`Query`接口或使用`StoredProcedureQuery`。这里我们主要介绍使用`StoredProcedureQuery`的方式,因为这种方式更适合处理复杂...

    hibernate调用存储过程.docx

    总之,Hibernate不仅支持简单的ORM操作,还提供了调用存储过程和定义命名SQL查询的能力,使得开发者可以灵活地处理各种数据库交互需求,提高代码的灵活性和可维护性。在实际开发中,理解并熟练掌握这些特性,将有助...

    Oracle+PlSql存储过程

    6. 通过Hibernate调用Oracle存储过程,需要配置和编写映射元数据,以便ORM框架能够正确地调用和处理返回值。 7. 使用Java调用Oracle存储过程分为三种情况:无返回值的过程、有单个返回值的过程和返回列表的过程。 *...

    oracle存储过程学习经典[语法+实例+调用].docx

    4. **Hibernate调用Oracle存储过程** Hibernate作为Java持久层框架,可通过`Session.createSQLQuery()`或`StoredProcedureQuery`来调用存储过程。 - 无返回值的存储过程:直接执行不获取结果。 - 有返回值的存储...

Global site tag (gtag.js) - Google Analytics