注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

Strus 1.2 中数据源配置问题排错过程  

2009-01-05 13:31:58|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  文章声明


作者:傲风(aofengblog@163.com)       编写时间:2009年01月05日

网址:http://aofengblog.blog.163.com


问题

今天北京一同事找到我,说他那边连接Oracle数据库有问题,让我帮忙看看,错误日志如下:
javax.servlet.UnavailableException: Initializing application data source dataSources [19:15:50.803] at org.apache.struts.action.ActionServlet.initModuleDataSources(ActionServlet.java:812) [19:15:50.803] at org.apache.struts.action.ActionServlet.init(ActionServlet.java:335) [19:15:50.803] at javax.servlet.GenericServlet.init(GenericServlet.java:69)

排除JDBC驱动的问题

远程连接过去,看到应用中使用了两个连接池,struts中配置了一个连接池,hibernate中也配置了一个连接池。而出错的struts中配置的连接池。
问北京的同事用的是什么版本的struts,回答说是1.1。

将错误日志设置成debug级别,发现提示错误信息:class "" for url “xxxxxxxxxxxxxx”,打开struts-config.xml,其datasourcs配置如下:
<data-sources>
    <data-source key="dataSources" type="org.apache.struts.util.GenericDataSource">
        <set-property property="driverClass" value="oracle.jdbc.driver.OracleDriver" />
        <set-property property="url" value="jdbc:oracle:thin:@192.168.11.2:1521:test" />
        <set-property property="maxActive" value="10" />
        <set-property property="maxWait" value="5000" />
        <set-property property="autoCommit" value="true" />
        <set-property property="user" value="usertest" />
        <set-property property="password" value="usertest" />
    </data-source>
</data-sources>

struts1.1中这样配置的,没有错。但日志明明提示driver class为空,且错误日志中还有如下的错误信息:
java.sql.SQLException: No suitable driver at java.sql.DriverManager.getDriver(DriverManager.java:243) at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)

难道是JDBC驱动有错?于是从Oracle官司方网下载一个驱动替换当前的驱动,还是报同样的错误,那么问题不在驱动程序这儿。

排除连接数据库配置参数

将类org.apache.struts.action.ActionServlet反编译,发现它根本就没有属性:driverClass,只有一个driverClassName。于是将配置文件中的driverClass改成driverClassName,再重启应用,这回报的错误信息不一样了:
Caused by: java.sql.SQLException: invalid arguments in call at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160) at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:184) at oracle.jdbc.driver.OracleConnection.

为了排除是连接数据库的问题或是用错了数据库实例名,我写了一个简单的直连Oracle的JSP页面(test.jsp),它的内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title>Oracle JDBC Driver Test</title>
</head>
<body>
<h1>Oracle JDBC Driver Test</h1>
<%
       String driverClass = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@10.2.11.2:1521:aimc";
    String user = "userstat";
    String password = "userstat";

    Connection con = null;
    Statement smt = null;
    ResultSet rs = null;
    try {
      Class.forName(driverClass).newInstance();
      con = DriverManager.getConnection(url, user, password);
      smt = con.createStatement();
      rs = smt.executeQuery("select phoneid from tianjin_stat where act_type='IMAP' and act_date=20090104");
%>
    <td>phoneid</td>
<%
            while (null != rs && rs.next()) {
%>
    <td><%=rs.getString(1)%></td>
<%
            }
       catch (Exception e) {
      e.printStackTrace(System.err);
    finally {
      if (null != rs) {
        rs.close();
        rs = null;
      }
      if (null != smt) {
        smt.close();
        smt = null;
      }
      if (null != con) {
        con.close();
        con = null;
      }
    }
    }
%>
</body>
</html>

将struts-config.xml中的datasources配置信息注释掉,重启应用,执行test.jsp,显示结果如下:
Strus 1.2 中数据源配置问题排错过程 - 傲风 -
至此,排除了可能有错误的连接参数的问题。

定位问题原因

看来还有一些参数配置有问题,为了确认Struts的原因,我打开应用中的struts.jar中的版本信息文件,发现是Struts1.2.7的,根本不是先前同事所讲的Struts 1.1。

进入Struts官方网站,查看它的Release Note和用户手册,文档中有提到Struts1.2.x不再支持GenericDataSource连接池(在Struts 1.1中是支持的)。同时根据文档要求重新配置各属性,其正确的配置文件如下:
<data-sources>
    <data-source key="dataSources" type="org.apache.commons.dbcp.BasicDataSource">
       <set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
       <set-property property="url" value="jdbc:oracle:thin:@192.168.11.2:1521:test" />
       <set-property property="maxActive" value="10" />
       <set-property property="maxWait" value="5000" />
       <set-property property="defaulAutoCommit" value="true" />
       <set-property property="username" value="usertest" />
       <set-property property="password" value="usertest" />
    </data-source>
</data-sources>

重启应用,一切顺利,不再提示错误信息,再执行JSP页面,界面正常显示。至此,问题解决。

Strus 1.2 中数据源配置问题排错过程 - 傲风 - 提示:使用各种框架时要注意不同版本的之间的差别。


<正文结束>

  评论这张
 
阅读(1518)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017