日期:2014-05-16  浏览次数:20432 次

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

??? ?? ?? 在jBPM(八): 也说jBPM + Tomcat + MySQL 里, 介绍了如何配置jBPM自带例子webSale运行在Tomcat中, 也陈述了这样一个实事: 到目前为止,还没发现问题,尽管跟网上介绍的繁琐配置不一样. jBPM(八)中的配置一个很大的不同点就是没有在Tomcat中配置JNDI,那么我们不意要问:webSale是怎么连的数据库呢?
??? 翻遍了webSale的代码也没找到类似new org.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 connection metadata 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 楼 rmn190 2009-09-22  
“hibernate.connection.url时的异常栈”, 呵呵,真是天助自助者,看似一个搞笑的改动,居然从它的异常栈找到了有用信息。

再说一次天助自助!