在simpleService里面注入一个继承HibernateDaoSupport的类,这个继承HibernateDaoSupport的类也必须实现序列化接口,simpleService类被序列化保存到数据库表 qrtz_job_details的job_class_name字段中,quartz在运行时会读取qrtz_job_details表中的 job_class_name将其反序列化。这也是为什么simpleService和其中注入各属性需要实现Serializable序列化接口的原因,所以你每次修改simpleService类或者其中的继承HibernateDaoSupport的类都要删除 qrtz_job_details表对应的job记录,否则可能会出现空指针异常,因为你如果你没有删除qrtz_job_details表中的记录,你修改的东东并不会自动更新到qrtz_job_details中,你用的还是原来旧版本的simpleService类。
在simpleService里面注入一个继承HibernateDaoSupport的类,这个继承HibernateDaoSupport的类也必须实现序列化接口,simpleService类被序列化保存到数据库表 qrtz_job_details的job_class_name字段中,quartz在运行时会读取qrtz_job_details表中的 job_class_name将其反序列化。这也是为什么simpleService和其中注入各属性需要实现Serializable序列化接口的原因,所以你每次修改simpleService类或者其中的继承HibernateDaoSupport的类都要删除 qrtz_job_details表对应的job记录,否则可能会出现空指针异常,因为你如果你没有删除qrtz_job_details表中的记录,你修改的东东并不会自动更新到qrtz_job_details中,你用的还是原来旧版本的simpleService类。
你的这个问题在我另一篇文章《Quartz任务监控管理》有人提到过,你也可以到http://www.iteye.com/topic/441951?page=1看看。
要做的并不是简单的从数据库读取cronExpression,而是能够通过前端(比如Web页面)的修改并且不需要重启服务的情况下就可以动态修改配置任务调度时间,并且对于quartx的数据持久化是透明的,只需在数据库增加12张表,修改一下quartx.properties文件的配置,其它并不需要你做些什么额外的斯工作。
JdbcPlaceholderConfigurer继承自PropertyPlaceholderConfigurer
,将原来配置在一个properties文件中的内容转移到数据库而己。JdbcPlaceholderConfigurer只是应用启动时简单的将cronExpression从数据库读取出来,每次修改完数据库后就都需要重启服务,新的修改才会生效。其实JdbcPlaceholderConfigurer还是一种静态配置,只是将原来写在
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0 0/50 * ? * * *" />
</bean>
中的cronExpression写到另外一个地方:数据库。
simpleService和其中注入各属性需要实现Serializable序列化接口,你的BakcupDao继承自HibernateDaoSupport虽然也实现了序列化接口,但是HibernateDaoSupport里的HibernateTemplate并没有实现序列化接口,所以你取得的HibernateTemplate永远为null。因此获取HibernateTemplate必须换一种方式,你的BakcupDao不能继承自HibernateDaoSupport。HibernateTemplate没有实现序列化接口,而SessionFactory是实现序列化接口的,在bakcupDao注入SessionFactory,通过SessionFactory获取HibernateTemplate。
你的bakcupDao可以这样写
- import java.io.Serializable;
- import org.hibernate.SessionFactory;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Repository;
- import com.sundoctor.example.service.SimpleService;
- @Repository("bakcupDao")
- public class BakcupDao implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private SessionFactory sessionFactory;
- @Autowired
- public void setSessionFactory(SessionFactory sessionFactory) {
- this.sessionFactory = sessionFactory;
- }
- public boolean backupDateabase(String dbname, String bfname) {
- final String dbName = dbname;
- final String bfname1 = bfname;
- HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
- return (Boolean)hibernateTemplate.execute(new HibernateCallback() {
- public Object doInHibernate(Session session) {
- boolean flag = true;
- PreparedStatement pstmt = null;
- try {
- pstmt = session.connection().prepareStatement("{call p_Backup_Or_Restore(?,?,?)}");
- pstmt.setString(1, bfname1);
- pstmt.setString(2, dbName);
- pstmt.setInt(3, 1);
- pstmt.execute();
- System.out.println("数据库已备份");
- } catch (Exception e) {
- flag = false;
- e.printStackTrace();
- }
- return flag;
- }
- });
- }
- }
本文探讨了在Quartz定时任务中使用Hibernate进行数据库操作时,如何解决序列化问题及优化方案。介绍了为何需要实现Serializable接口,以及如何正确地在DAO层注入SessionFactory而非直接使用HibernateTemplate。
1018

被折叠的 条评论
为什么被折叠?



