服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

quartz与hibernate数据库连接的结合


   首先介绍一下我们的系统构架,采用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加#的供参考.

扫描关注微信公众号