why 发表于 2017-2-8 12:09:43

jBPM(九):jBPM的webSale在Tomcat下怎么连上的数据库?

  在jBPM(八): 也说jBPM + Tomcat + MySQL里,介绍了如何配置jBPM自带例子webSale运行在Tomcat中, 也陈述了这样一个实事:到目前为止,还没发现问题,尽管跟网上介绍的繁琐配置不一样.jBPM(八)中的配置一个很大的不同点就是没有在Tomcat中配置JNDI,那么我们不意要问:webSale是怎么连的数据库呢?
   翻遍了webSale的代码也没找到类似neworg.hibernate.cfg.Configuration().configure()这样的代码,而且更为神奇的是打开Hibernate的Configuration类源码在关键地方(Configuration()和configure())设置了断点,Tomcat启动时竟然没停!Tomcat启动后随便点webSale里的login等操作,前面设置的断点也没停!
    这就是传说中的闹鬼?!
    为了"捉鬼", 我把jBPM(八): 也说jBPM + Tomcat + MySQL里第四步拷到Eclipse里的hibernate.cfg.xml改了数据库连接, 心想: 这下看你webSale怎么连?给你一个错的hibernate.connection.url. 果然没有连上,报"Could not obtain connectionmetadata java.sql.SQLException:Access denied for user'root'@'localhost' (using password: YES)"异常信息了. 呵呵, 看来这个世界上没鬼.
    好吧, 既然没鬼了,那就按咱们先辈传来的唯物主义思想来查问题吧. 于是看了, 上面改hibernate.connection.url时的异常栈, 发现这么一条有用的执行语句:
        at org.jbpm.persistence.db.DbPersistenceServiceFactory.getSessionFactory(DbPersistenceServiceFactory.java:91)
于是在Eclipse中Ctrl+Shift+T(打开源码的快捷方式)找到DbPersistenceServiceFactory类的第91行,原来有这么一条语句:
        sessionFactory = getConfiguration().buildSessionFactory();
这个buildSessionFactory()倒是自写HibernateUtil中的很常用的方法, 有门了,于顺藤摸瓜地看getConfiguration()这个方法的定义,再进而找到了HibernateHelper这么个类,呵呵, 发现亲人了!这不跟自写的HibernateUtil类很像么?
    于是在这个HibernateHelper类里看到盼望已久的代码:
        Configuration configuration = new Configuration();
        .........
        log.debug("using default hibernate configuration resource (hibernate.cfg.xml)");
        configuration.configure();
    到这里, 问题解决了95%了,再剩下的一个问题就是:是谁在调用上面红色代码的? webSale中体现在哪? 于是又一番顺藤摸瓜后, 发现是web.xml中配置的JbpmThreadsServlet类在init方法里以启动新线程的方式做了调用.

   至此, "jBPM的webSale在Tomcat下怎么连数据库?"问题算是100%解决了,不过在这个问题的解决送给我两个意外收获:JbpmThreadsServlet的妙用和HibernateUtil的职业写法,在后续的blog中将陆续梳理出来,"予人余香,手留玫瑰"地贴在这里, 敬请关注.
页: [1]
查看完整版本: jBPM(九):jBPM的webSale在Tomcat下怎么连上的数据库?