struts2.0.11+spring2.5.3+hibernate3.2.6不能连接oracle10G数据库案例及解决办法

wudeyan 2008-06-11 09:14:13
背景:

我在windows XP下做开发,环境为struts2.0.11+spring2.5.3+hibernate3.2.6+oracle10G@linux,系统使用tomcat5自带的数据库连接池功能,spring通过jndi引用该连接池。在XP下运行正常。今天下午我把系统移植到fedora core5环境下,tomcat和java版本同XP,数据库为同一数据库。


错误:

把所有需要的文件复制过去后,启动tomcat5,发现数据库连接不上。
错误日志如下:
2008-6-11 20:41:40 org.hibernate.util.JDBCExceptionReporter logExceptions
严重: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
2008-6-11 20:41:40 org.hibernate.cfg.SettingsFactory buildSettings
警告: Could not obtain connection metadata
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766)
。。。。。。
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
。。。。。。
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:760)
... 60 more

日志写得非常清楚,错误原因为驱动找不到"java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver"。


解决过程:

整个解决过程非常麻烦,为了条理清晰,我归纳一下,分点列出。

一、可能有人看到这里会想当然地认为是缺了class12.jar或ojdbc14.jar文件。我使用tomcat5+struts1和2很久(只不过第一次做SSH整合),不会犯这样的错误。错误出现后,我无数地确认common/lib下有对应数据库oracle10G的ojdbc14.jar。我把ojdbc14.jar复制一份到webapps/应用系统(以下简称应用为A)/WEB-INF/lib目录下,错误依旧。

二、该tomcat下尚有应用B、C,我把刚发布的A删除,其它不作任何修改,启动B、C时日志不报错,没真正测试B、C即认为B、C能正常连接数据库(B、C是纯struts2应用,其实仍然连接不上数据库,只是日志没反应,最后回头解释该问题),百思不得其解。

三、重新发现A,换不同版本的数据库驱动class12.jar、class12.zip等,问题依旧。

四、百度、古狗所有认识的搜索引擎全上,尝试了无数种搜索出来的方法,问题依旧。

五、设置linux环境变量CLASSPATH专门指向ojdbc14.jar,仍然报找不到驱动,奇了怪了。偶的驱动就在眼皮底下呀。


最后结果:

突然不知触动了哪根筋,我去ll了一下common/lib下的文件,灵感一来,发现所有文件的owner/group都是root/root。除ojdbc14外所有其它文件的权限均为:-rw-r--r--,唯独ojdbc14.jar为-rw-r-----,我想,tomcat5应该是以tomcat身份启动服务,目前的设置用户tomcat无权读取ojdbc14.jar,改为-rw-r--r--。重启tomcat5,一切OK。

原因:原来应用B、C使用驱动class12.jar,hibernate3.2+oracle10.0.2.1如果使用的驱动版本不对,对数据库操作时会出错,不同的版本会导致不同的错误。所以,我发现A时顺便把驱动换成对应的ojdbc14.jar。

上面说到为什么换成ojdbc14.jar后B、C不报错?因为B、C是纯struts应用,struts启动时并不真正连接数据库,只能在客户访问数据库时struts才启动tomcat5的数据库连接池,所以启动B、C时日志中并不报错。加上spring后就不一样了,spring启动时就会加载相应连接数据库的实例。

所花时间:下午4点到晚上8点半,共4.5小时。


总结:
搜索了很久,都没有适合我的答案。作为一个程序员,我想我应该把这个案例公布出来供其他同行参考。

欢迎转载该文,转载时最好标明本人原作者。

另外,这次SSH整合开发过程中遇到很多问题,如果有人感兴趣,哪天我一一写出来供大家参考。
...全文
183 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wudeyan 2008-06-11
  • 打赏
  • 举报
回复
上面有错误字:
上面有错别字:

NND,越错越多。
wudeyan 2008-06-11
  • 打赏
  • 举报
回复
上面有错误字:
三、重新发现A,换不同版本的数据库驱动class12.jar、class12.zip等,问题依旧。
发现应为发布。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧