不久前工作中又到了hibernate调用oracle存储过程和Oracle job方式定时执行存储过程

最近工作中又到了hibernate调用oracle存储过程和Oracle job方式定时执行存储过程
<div class="iteye-blog-content-contain" style="font-size: 14px">
   最近工作中用到了oracle的存储过程,用hibernate调用,而且要定时执行,之后我选择了spring的定时任务,不过后面被要求使用oracle的job
   虽然网上有很多关于hibernate调用oracle存储过程的文章,但是由于我们公司有自己的架构,封装了hibernate,所以有时候使用session时,会无缘无故的出现数据库连接泄漏的异常,最终终于找到一个可行的方式。
存储过程:
-- ----------------------------
-- 更新isOnline状态的存储过程
-- ----------------------------
CREATE OR REPLACE
PROCEDURE AUTO_COMPLETE_ISONLIEN_PROC(inter IN NUMBER)
AS
BEGIN
UPDATE DEVICE_INFO SET
IS_ONLINE='0' WHERE ROUND(TO_NUMBER(SYSDATE-LAST_HEATBEAT_DATE)*60*60*24)>inter;
UPDATE DEVICE_INFO SET
IS_ONLINE='1' WHERE ROUND(TO_NUMBER(SYSDATE-LAST_HEATBEAT_DATE)*60*60*24)<inter;
COMMIT;
END;
    /**
* 调用更新isOnline状态的存储过程
* @param interval
*/
public void execProcIsonline(long interval){
Session session=entityDao.getSessionFactory().openSession();
SQLQuery query=session.createSQLQuery("{call AUTO_COMPLETE_ISONLIEN_PROC(:interval)}");
query.setParameter("interval", interval);
int size=query.executeUpdate();
logger.info("update size:"+size);
session.close();
}
     
spring方式定时执行存储过程:
编写执行任务的job:
public class IntervalOnlineTaskJob {

private Logger logger=Logger.getInstance(IntervalOnlineTaskJob.class);

private DeviceInfoManager deviceInfoManager;
private long interval;

/**
* @see 执行更新机顶盒状态定时器任务
*/
public void intervalOnline(){
logger.info("更新机顶盒状态定时任务执行...");
deviceInfoManager.execProcIsonline(interval);
}

public void setDeviceInfoManager(DeviceInfoManager deviceInfoManager) {
this.deviceInfoManager = deviceInfoManager;
}
public void setInterval(long interval) {
this.interval = interval;
}


}
然后在spring配置:
<!--更新机顶盒状态定时任务相关-->
<bean id="taskJob" class="com.onewaveinc.tview.management.util.IntervalOnlineTaskJob">
<property name="deviceInfoManager">
<ref bean="tview.management.deviceInfoManager"/>
</property>
<property name="interval">
<value>${heatbeat.time.interval}</value>
</property>
</bean>
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject">
           <ref bean="taskJob" />
       </property>
       <property name="targetMethod">
           <value>intervalOnline</value>
       </property>
    </bean>
     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <!-- 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 -->
       <property name="jobDetail">
           <ref bean="methodInvokingJobDetail" />
       </property>
       <!--每一分钟一次调度 -->
       <property name="cronExpression">
           <value>0 0/1 * * * ?</value>
       </property>
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       <!-- 添加触发器 -->
       <property name="triggers">
           <list>
              <ref local="cronTrigger" />
           </list>
       </property>
    </bean>



oraclejob方式定时执行存储过程:
declare job0 number;
begin
  sys.dbms_job.submit(job => job0,
                      what => 'AUTO_COMPLETE_ISONLIEN_PROC(900);',
                      next_date => to_date('27-03-2013 11:50:59', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate+1/1440');
  commit;
end;
</div>