Spring+hibernate+quartz 通过sessionFactory定时操作数据库
来源:互联网 发布:淘宝店铺能叫旗舰店吗 编辑:程序博客网 时间:2024/05/16 07:19
spring+hibernate框架中要做一个定时任务,需要查询或是更新数据库内容,直接配置sessionFactory是会报错的,会出现no session的问题、或是transaction non-bound等问题。这里直接给一个实现的示例吧!下载链接
主要是建立了模板模式的抽象类AutoQuartzTask,继承至QuartzJobBean类;在这个类中声明sessionFactory变量。
<span style="font-family: Arial, Helvetica, sans-serif;">package com.quartz.task;</span>
import org.apache.log4j.Logger;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.orm.hibernate3.SessionFactoryUtils;import org.springframework.orm.hibernate3.SessionHolder;import org.springframework.scheduling.quartz.QuartzJobBean;import org.springframework.transaction.support.TransactionSynchronizationManager;public abstract class AutoQuartzTask extends QuartzJobBean {private SessionFactory sessionFactory;private static final Logger log=Logger.getLogger(AutoQuartzTask.class);public SessionFactory getSessionFactory() {return sessionFactory;}public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overrideprotected void executeInternal(JobExecutionContext ctx)throws JobExecutionException { Session session = SessionFactoryUtils.getSession(sessionFactory, true); boolean existingTransaction = SessionFactoryUtils .isSessionTransactional(session, getSessionFactory()); if (existingTransaction) { log.info("Found thread-bound Session for TransactionalQuartzTask"); } else { TransactionSynchronizationManager.bindResource(getSessionFactory(), new SessionHolder(session)); } try { executeTask(ctx); } catch (HibernateException ex) { ex.printStackTrace(); throw ex; } finally { if (existingTransaction) { log.debug("Not closing pre-bound Hibernate Session after TransactionalQuartzTask"); } else { TransactionSynchronizationManager .unbindResource(getSessionFactory()); SessionFactoryUtils .releaseSession(session, getSessionFactory()); } } }public abstract void executeTask(JobExecutionContext ctx) ;}真正的业务操作就放在AutoQuartzTask的子类中实现了
package com.quartz.task;import java.util.List;import org.hibernate.Query;import org.quartz.JobExecutionContext;import com.quartz.model.User;@SuppressWarnings("unchecked")public class QuartzSession extends AutoQuartzTask {private FirstQuartz firstQuartz;//这是一个普通的类,不操作数据库,(可去掉)@Overridepublic void executeTask(JobExecutionContext ctx) {firstQuartz.doTestJob();Query query=getSessionFactory().getCurrentSession().createQuery("from User");List<User> list = query.list();for (User user : list) {System.out.println(user.toString());}}public FirstQuartz getFirstQuartz() {return firstQuartz;}public void setFirstQuartz(FirstQuartz firstQuartz) {this.firstQuartz = firstQuartz;}}spring的配置:
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><bean id="firstQuartz" class="com.quartz.task.FirstQuartz"></bean><bean id="buildSessionJob" class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass"><value>com.quartz.task.QuartzSession</value></property><property name="jobDataAsMap"><map><entry key="sessionFactory" value-ref="sessionFactory"></entry><entry key="firstQuartz" value-ref="firstQuartz"></entry></map></property></bean><bean id="simpleAutoBuild" class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail"><ref bean="buildSessionJob" /></property><property name="repeatInterval"><value>5000</value></property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="simpleAutoBuild" /></list></property></bean></beans>
详细的介绍,可查看以下连接:
http://john521.iteye.com/blog/1294149
http://kevin19900306.iteye.com/blog/1397744
http://isoloist.iteye.com/blog/785033
示例代码
0 0
- Spring+hibernate+quartz 通过sessionFactory定时操作数据库
- java Spring调整Quartz定时备份数据库
- spring+quartz+数据库实现定时任务
- Quartz作业调度定时完成数据库操作
- spring 定时任务注入sessionfactory
- Spring整合Hibernate动态切换SessionFactory (切换数据库方言)
- Spring 通过配置向 Quartz定时任务 注入service
- spring的quartz定时
- Spring Quartz定时详情
- Spring+Quartz定时任务
- Spring Quartz定时详情
- spring quartz 定时任务
- Spring-quartz定时任务
- spring 定时任务 quartz
- Spring Quartz定时详情
- Spring Quartz定时详解
- spring quartz 定时任务
- spring Quartz 定时任务
- OC之NSString
- [leetcode] Add and Search Word - Data structure design
- 双向链表的简单操作
- WordPress foxpay 收费下载资源插件 vip会员功能/收费下载/收费查看/联盟推广+前端用户中心 支付宝/财付通/贝宝/网银[更新至v4.5]
- 重绘的实现
- Spring+hibernate+quartz 通过sessionFactory定时操作数据库
- Hadoop之MapReduce—Wordcount
- Codevs1186 F函数题解
- ps转手绘
- Xib中调整button的imageView和TitleLabel的位置
- 项目Bug 解决
- 旋转数组的最小值问题
- poco 数据库连接池
- 在velocity使用toolbox.xml