全面介绍Hibernate Quartz

开发 后端
这里介绍Hibernate Quartz各自拥有的自己数据库配置和连接池的配置,现在的任务是把两者用同一套配置。

在向大家详细介绍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。

【编辑推荐】

  1. Hibernate对数据索引进行缓存
  2. 剖析Hibernate主键生成几种常用方式
  3. 浅析Hibernate实现实体对象延迟加载
  4. Hibernate集合类型的延迟加载特性
  5. 概括Hibernate属性延迟加载
责任编辑:佚名 来源: IT168
相关推荐

2009-09-28 10:24:58

Hibernate基础

2009-09-25 09:46:03

Hibernate s

2009-09-23 17:41:05

Hibernate事务

2009-09-25 17:19:28

Hibernate持久

2009-09-21 16:56:14

Hibernateibatis

2009-09-28 16:54:34

Hibernate示例

2009-09-24 10:50:31

Hibernate主键

2009-09-28 17:27:27

Hibernate A

2009-09-25 16:27:33

Hibernate S

2009-09-23 15:50:21

Hibernate u

2009-09-29 10:12:03

Hibernate A

2009-09-22 11:24:07

Hibernate查询

2009-09-22 15:22:08

Hibernate性能

2009-09-21 17:46:34

Hibernate持久

2009-09-27 14:41:05

Hibernate I

2009-09-22 09:27:29

Hibernate P

2009-09-25 13:55:05

Hibernate使用

2009-09-27 17:46:22

Hibernate监听

2009-06-17 11:18:02

Hibernate延迟

2009-09-21 16:40:42

Hibernate可行
点赞
收藏

51CTO技术栈公众号