全面介绍HibernateQuartz

在向大家详细介绍Hibernate Quartz之前,首先让大家了解下我们的系统构架,然后全面介绍Hibernate Quartz。

首先介绍一下我们的系统构架,采用webwork,spring,Hibernate整合架构,现在引入Quartz框架,Hibernate Quartz各自拥有的自己数据库配置和连接池的配置,现在的任务是把两者用同一套配置.

先谈谈Quartz,我用的版本是1.5.1,后面的版本我没去看了,没时间,接下来说的都以这个版本为准.Quartz虽然在提供一个 ConnectionProvider接口,提供给程序扩展,但是看它的StdSchedulerFactory实现类,要对它进行扩展还是一件比较麻烦一件事情,所以我就直接修改了StdSchedulerFactory类,以达到的我的需求.

接下来的问题是既然要结合,那么让Quartz来提供连接池配置呢还是有Hibernate提供.研究了两者的连接池方面的源代码,发现 Hibernate的连接池设计远远好于Quartz,Quartz目前只提供一个连接池提供类PoolingConnectionProvider,而且使用的连接池是dbcp,这个连接池听说问题多多,相反Hibernate提供了更加灵活的配置,所以连接池由Hibernate提供.

首先实现一个Quartz中ConnectionProvider子类HibernateConnectionProvider

 
 
 
  1. public class HibernateConnectionProvider implements ConnectionProvider {  
  2. private Connection con = null;  
  3. protected static ThreadLocal hibernateHolder = new ThreadLocal();  
  4. public Connection getConnection() throws SQLException {  
  5. con = null;  
  6. SessionFactoryImpl sessionFactory = null;  
  7. sessionFactory = (SessionFactoryImpl) Global.getSessionFacotry();  
  8. con = sessionFactory.getConnectionProvider().getConnection();  
  9. return con;  
  10. }  
  11. public void shutdown() throws SQLException {  
  12. // FIXME Auto-generated method stub  
  13. }  

然后修改StdSchedulerFactory,在不破坏其本来的逻辑和可配置性下进行了相应的修改.修改的是private Scheduler instantiate() throws SchedulerException方法,找到//Set up any DataSources段进行修改,代码如下:

 
 
 
  1. String[] dsNames = cfg.getPropertyGroups(PROP_DATASOURCE_PREFIX);  
  2. for (int i = 0; i < dsNames.length; i++) {  
  3. PropertiesParser pp = new PropertiesParser
    (cfg.getPropertyGroup(PROP_DATASOURCE_PREFIX + "." + dsNames[i], true));  
  4.  
  5. String dsDriver = pp.getStringProperty(PROP_DATASOURCE_DRIVER, null);  
  6. String dsURL = pp.getStringProperty(PROP_DATASOURCE_URL, null);  
  7. boolean dsAlwaysLookup = pp.getBooleanProperty
    (PROP_DATASOURCE_JNDI_ALWAYS_LOOKUP, false);  
  8. String dsUser = pp.getStringProperty(PROP_DATASOURCE_USER, "");  
  9. String dsPass = pp.getStringProperty(PROP_DATASOURCE_PASSWORD, "");  
  10. int dsCnt = pp.getIntProperty(PROP_DATASOURCE_MAX_CONNECTIONS, 3);  
  11. String providerClass = pp.getStringProperty
    (PROP_DATASOURCE_PROVIDER_CLASS, null);  
  12. String dsJndi = pp.getStringProperty(PROP_DATASOURCE_JNDI_URL, null);  
  13. String dsJndiInitial = pp.getStringProperty(PROP_DATASOURCE_JNDI_INITIAL, null);  
  14. String dsJndiProvider = pp.getStringProperty(PROP_DATASOURCE_JNDI_PROVDER, null);  
  15. String dsJndiPrincipal = pp.getStringProperty(PROP_DATASOURCE_JNDI_PRINCIPAL, null);  
  16. String dsJndiCredentials = pp.getStringProperty
    (PROP_DATASOURCE_JNDI_CREDENTIALS, null);  
  17. String dsValidation = pp.getStringProperty(PROP_DATASOURCE_VALIDATION_QUERY, null);  
  18. if (providerClass == null  
  19. || providerClass.equals("")  
  20. || providerClass.equals("org.quartz.utils.PoolingConnectionProvider")) {  
  21. if (dsDriver == null) {  
  22. initException = new SchedulerException
    ("Driver not specified for DataSource: "+ dsNames[i]);  
  23. throw initException;  
  24. }  
  25. if (dsURL == null) {  
  26. initException = new SchedulerException
    ("DB URL not specified for DataSource: "+ dsNames[i]);  
  27. throw initException;  
  28. }  
  29. try {  
  30. PoolingConnectionProvider cp = new PoolingConnectionProvider
    (dsDriver, dsURL, dsUser, dsPass, dsCnt,dsValidation);  
  31. dbMgr = DBConnectionManager.getInstance();  
  32. dbMgr.addConnectionProvider(dsNames[i], cp);  
  33. }  
  34. catch (SQLException sqle) {  
  35. initException = new SchedulerException
    ("Could not initialize DataSource: " + dsNames[i],sqle);  
  36. throw initException;  
  37. }  
  38. }  
  39. else if (providerClass.equals("org.quartz.utils.JNDIConnectionProvider")) {  
  40. Properties props = null;  
  41. if (null != dsJndiInitial || null != dsJndiProvider  
  42. || null != dsJndiPrincipal || null != dsJndiCredentials) {  
  43. props = new Properties();  
  44. if (dsJndiInitial != null)props.put(PROP_DATASOURCE_JNDI_INITIAL, dsJndiInitial);  
  45. if (dsJndiProvider != null)props.put(PROP_DATASOURCE_JNDI_PROVDER, dsJndiProvider);  
  46. if (dsJndiPrincipal != null)props.put(PROP_DATASOURCE_JNDI_PRINCIPAL,dsJndiPrincipal);  
  47. if (dsJndiCredentials != null)props.put
    (PROP_DATASOURCE_JNDI_CREDENTIALS,dsJndiCredentials);  
  48. }  
  49. JNDIConnectionProvider cp = new JNDIConnectionProvider(dsJndi,props, dsAlwaysLookup);  
  50. dbMgr = DBConnectionManager.getInstance();  
  51. dbMgr.addConnectionProvider(dsNames[i], cp);  
  52. }  
  53. else if (providerClass  
  54. .equals("org.quartz.utils.HibernateConnectionProvider")) {  
  55. HibernateConnectionProvider cp = new HibernateConnectionProvider();  
  56. dbMgr = DBConnectionManager.getInstance();  
  57. dbMgr.addConnectionProvider(dsNames[i], cp);  
  58. }  
  59. else {  
  60. initException = new SchedulerException
    ("Provider_Class not Supported: " + providerClass);  
  61. throw initException;  
  62. }  

以上介绍Hibernate Quartz。

网站栏目:全面介绍HibernateQuartz
网址分享:http://www.hantingmc.com/qtweb/news42/371542.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联