排除了网络问题,就要仔细的review一下你的代码了

解决方案 »

  1.   

    /**
     * 
     * @author zhuyang
     * 从PDM数据库中取数据,得到一个ArrayList集合
     */
    public class DateFromDB { static Logger log = Logger.getLogger(DateFromDB.class.getName());

    public ArrayList getDateSource(String sqlStr) { Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    ArrayList resultList = new ArrayList();
    HashMap resultMap = new HashMap();

    try {
    Context ctx = new InitialContext();
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/plmdb");
    log.debug("================JNDI连接成功=====================");
    //为什么开始总是到获取连接处程序停止且不抛出异常
    conn = ds.getConnection();
    log.debug("================获取连接成功=====================");
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sqlStr);

    while (rs.next()) {
    resultMap = new HashMap();
    int columnCount = 1;
    // 用HashMap封装查询出的一条记录
    while (columnCount <= rs.getMetaData().getColumnCount()) {
    if (rs.getObject(columnCount) instanceof java.sql.Date
    || rs.getObject(columnCount) instanceof java.sql.Timestamp
    || rs.getObject(columnCount) instanceof java.util.Date
    || rs.getObject(columnCount) instanceof java.sql.Time) {
    rs.getMetaData().getColumnType(columnCount);
    resultMap.put(rs.getMetaData().getColumnName(
    columnCount), rs.getTimestamp(columnCount));
    } else if (rs.getObject(columnCount) instanceof java.lang.String) {
    resultMap.put(rs.getMetaData().getColumnName(
    columnCount), rs.getString(columnCount).trim());
    } else {
    resultMap.put(rs.getMetaData().getColumnName(
    columnCount), rs.getObject(columnCount));
    }
    columnCount++;
    }
    // 用ArrayList数组封装查询出的多条记录
    resultList.add(resultMap);
    }
    } catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally {

    //关闭ps 和conn 对象
    try {
    if (rs != null) {
    rs.close();
    }
    if (stmt != null) {
    stmt.close();
    }
    if (conn != null) {
    conn.close();
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    return resultList; }

    }
      

  2.   

    tomcat作了以下配置
    <Resource name="jdbc/plmdb"
            type="javax.sql.DataSource"
            driverClassName="oracle.jdbc.OracleDriver"
            username="system"
            password="manager"
            maxIdle="5"
            maxWait="5000"
            url="jdbc:oracle:thin:@10.3.3.137:9081:plmdb"
            maxActive="10"/>
    web.xml
    <resource-ref>
    <description>DB pool Connection</description>
    <res-ref-name>jdbc/plmdb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>
      

  3.   

    LZ你直接用jdbc能连接吗?
    用jndi连数据库第一次比较耗费时间.
    从代码看不出问题...
      

  4.   

    我想,对于这个问题的话,你可以用PL/SQL或eclipose myeclipse database 先连接一下,看是不是由于oracle的设置有问题,如果能连接的话,再看代码连接的问题啦!
      

  5.   

    log.debug("================JNDI连接成功====================="); 
    这个能够打印出来肯定说明已经找到数据源了啊。
    下面就停了,有时候会报异常,有时候什么异常都没有程序就中断了。
      

  6.   

    异常如下
    org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Io 异常: Bad packet type)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:855)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)最郁闷得是,这里是应用定时取数据。我设置时间规则是每30秒取一次(时间短便于测试)。
    WEB容器启动后最开始几次都是在getConnction那里中断,但是并不抛出任何异常,
    在连续对数据库6-7次访问后,才会在getConnection那里抛出以上异常。
    异常得抛出为什么有时候有时候没有呢!
    不明白
      

  7.   

    楼主认为出错的地方的代码我试验没有错误。也就是说
    log.debug("================JNDI连接成功====================="); 
    //为什么开始总是到获取连接处程序停止且不抛出异常 
    conn = ds.getConnection(); 
    这两行都可以执行的。如果说楼主是这个地方执行通过不了建议查一下数据库吧。代码应该没问题。配置好像也没有错。
      

  8.   

    可能oracle 的listener 没有打开
    lsnrctl status;
    lsnrctl start listenerName;