首先介绍一下我们的系统构架,采用webwork,spring,hibernate整合架构,现在引入quartz框架,quartz和 hibernate各自拥有的自己数据库配置和连接池的配置,现在的任务是把两者用同一套配置.
先谈谈quartz,我用的版本是1.5.1,后面的版本我没去看了,没时间,接下来说的都以这个版本为准.quartz虽然在提供一个 connectionprovider接口,提供给程序扩展,但是看它的stdschedulerfactory实现类,要对它进行扩展还是一件比较麻烦一件事情,所以我就直接修改了stdschedulerfactory类,以达到的我的需求.
接下来的问题是既然要结合,那么让quartz来提供连接池配置呢还是有hibernate提供.研究了两者的连接池方面的源代码,发现 hibernate的连接池设计远远好于quartz,quartz目前只提供一个连接池提供类poolingconnectionprovider,而且使用的连接池是dbcp,这个连接池听说问题多多,相反hibernate提供了更加灵活的配置,所以连接池由hibernate提供.
首先实现一个quartz中connectionprovider子类hibernateconnectionprovider
public class hibernateconnectionprovider implements connectionprovider {
private connection con = null;
protected static threadlocal hibernateholder = new threadlocal();
public connection getconnection() throws sqlexception {
con = null;
sessionfactoryimpl sessionfactory = null;
sessionfactory = (sessionfactoryimpl) global.getsessionfacotry();
con = sessionfactory.getconnectionprovider().getconnection();
return con;
}
public void shutdown() throws sqlexception {
// fixme auto-generated method stub
}
}
,然后修改stdschedulerfactory,在不破坏其本来的逻辑和可配置性下进行了相应的修改.修改的是private scheduler instantiate() throws schedulerexception方法,找到//set up any datasources段进行修改,代码如下:
string[] dsnames = cfg.getpropertygroups(prop_datasource_prefix);
for (int i = 0; i < dsnames.length; i++) {
propertiesparser pp = new propertiesparser(cfg.getpropertygroup(
prop_datasource_prefix + "." + dsnames[i], true));
string dsdriver = pp
.getstringproperty(prop_datasource_driver, null);
string dsurl = pp.getstringproperty(prop_datasource_url, null);
boolean dsalwayslookup = pp.getbooleanproperty(
prop_datasource_jndi_always_lookup, false);
string dsuser = pp.getstringproperty(prop_datasource_user, "");
string dspass = pp.getstringproperty(prop_datasource_password, "");
int dscnt = pp.getintproperty(prop_datasource_max_connections, 3);
string providerclass = pp.getstringproperty(
prop_datasource_provider_class, null);
string dsjndi = pp
.getstringproperty(prop_datasource_jndi_url, null);
string dsjndiinitial = pp.getstringproperty(
prop_datasource_jndi_initial, null);
string dsjndiprovider = pp.getstringproperty(
prop_datasource_jndi_provder, null);
string dsjndiprincipal = pp.getstringproperty(
prop_datasource_jndi_principal, null);
string dsjndicredentials = pp.getstringproperty(
prop_datasource_jndi_credentials, null);
string dsvalidation = pp.getstringproperty(
prop_datasource_validation_query, null);
if (providerclass == null
|| providerclass.equals("")
|| providerclass
.equals("org.quartz.utils.poolingconnectionprovider")) {
if (dsdriver == null) {
initexception = new schedulerexception(
"driver not specified for datasource: "
+ dsnames[i]);
throw initexception;
}
if (dsurl == null) {
initexception = new schedulerexception(
"db url not specified for datasource: "
+ dsnames[i]);
throw initexception;
}
try {
poolingconnectionprovider cp = new poolingconnectionprovider(
dsdriver, dsurl, dsuser, dspass, dscnt,
dsvalidation);
dbmgr = dbconnectionmanager.getinstance();
dbmgr.addconnectionprovider(dsnames[i], cp);
} catch (sqlexception sqle) {
initexception = new schedulerexception(
"could not initialize datasource: " + dsnames[i],
sqle);
throw initexception;
}
} else if (providerclass
.equals("org.quartz.utils.jndiconnectionprovider")) {
properties props = null;
if (null != dsjndiinitial || null != dsjndiprovider
|| null != dsjndiprincipal || null != dsjndicredentials) {
props = new properties();
if (dsjndiinitial != null)
props.put(prop_datasource_jndi_initial, dsjndiinitial);
if (dsjndiprovider != null)
props.put(prop_datasource_jndi_provder, dsjndiprovider);
if (dsjndiprincipal != null)
props.put(prop_datasource_jndi_principal,
dsjndiprincipal);
if (dsjndicredentials != null)
props.put(prop_datasource_jndi_credentials,
dsjndicredentials);
}
jndiconnectionprovider cp = new jndiconnectionprovider(dsjndi,
props, dsalwayslookup);
dbmgr = dbconnectionmanager.getinstance();
dbmgr.addconnectionprovider(dsnames[i], cp);
} else if (providerclass
.equals("org.quartz.utils.hibernateconnectionprovider")) {
hibernateconnectionprovider cp = new hibernateconnectionprovider();
dbmgr = dbconnectionmanager.getinstance();
dbmgr.addconnectionprovider(dsnames[i], cp);
} else {
initexception = new schedulerexception(
"provider_class not supported: " + providerclass);
throw initexception;
}
}
最后就是修改配置文件quartz.properties,加入
#org.quartz.datasource.myds.provider_class = org.quartz.utils.jndiconnectionprovider
#org.quartz.datasource.myds.provider_class = org.quartz.utils.poolingconnectionprovider
org.quartz.datasource.myds.provider_class = org.quartz.utils.hibernateconnectionprovider加#的供参考.
闽公网安备 35060202000074号