java.sql.SQLException:没有找到适合jdbc:oracle:thin的驱动程序



我目前有一个web应用程序,有某些类能够连接到我的数据库,但另一个类不能。不管出于什么原因,我已经开始在我的一个类中得到这个异常。下面是我所做的:

  1. 我正在使用Java 7,并在我的类路径和lib文件夹中都有ojdbc7
  2. 我有多个类谁可以连接到url文件,但我的其他类不能和抛出"java.sql。jdbc:oracle:thin:@someurl"
  3. 我的类能够访问数据库后,我已经连接到它在另一个类
  4. 我有一个配置包含URL的属性文件,所以我知道URL没有错,永远不会改变

这是我的程序失败的代码。我不连接到数据库,直到我调用这个方法:

    public SimpleEntry<String, String> loadOrders(File file) {
    SimpleEntry<String, String> response = new SimpleEntry<String, String>(
            "", "");
    PreparedStatement st = null;
    ResultSet rs = null;
    Connection con = null;
    try {
        Scanner scan = new Scanner(file);
        String header = "";
        String trailer = "";
        int orderCtr = 0;
        int valueCtr = 0;
        String request = "";
        ArrayList<HashMap<String, String>> orders = 
new ArrayList<HashMap<String, String>>();
        log.info("Scanning content");
        // start to scan content
        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            Scanner sc = new Scanner(line);
            sc.useDelimiter("t");
            String type = sc.next();
            // differentiates between header, trailer, and content
            if (type.equals("H")) {
                header = line;
            } else if (type.equals("T")) {
                trailer = line;
                break;
            } else {
                // begin to enter in data appropriately from method's
                // parameter
                // key of map = column, value = data being inserted
                HashMap<String, String> order = new HashMap<String, String>();
                // Format:
                /*
                 * CLIENT_CUSTOMER_ID, FIRST_NAME, LAST_NAME,___, ADDRESS1,
                 * ADDRESS2, CITY, STATE, POSTAL_CODE, PHONE, EMAIL_ADDRESS,
                 * STORE_NUMBER, DELIVERY_METHOD,___, REWARD_VALUE,___,___,
                 * CARD_ACTIVE_DATE, CARD_EXPIRED_DATE, REQUEST
                 */
                order.put("CLIENT_CUSTOMER_ID", sc.next());
                String name = sc.next();
                order.put("FIRST_NAME", name.substring(0, 1).toUpperCase()
                        + name.substring(1).toLowerCase());
                name = sc.next();
                order.put("LAST_NAME", name.substring(0, 1).toUpperCase()
                        + name.substring(1).toLowerCase());
                sc.next();
                order.put("ADDRESS1", sc.next());
                order.put("ADDRESS2", sc.next());
                order.put("CITY", sc.next());
                order.put("STATE", sc.next());
                order.put("POSTAL_CODE", sc.next());
                order.put("PHONE", sc.next());
                order.put("EMAIL_ADDRESS", sc.next());
                order.put("STORE_NUMBER", sc.next());
                order.put("DELIVERY_METHOD", sc.next());
                sc.next();
                // purpose of valueCtr -> count reward values for a total
                String oVal = sc.next();
                valueCtr += Integer.parseInt(oVal);
                order.put("REWARD_VALUE", oVal);
                sc.next();
                sc.next();
                order.put("CARD_ACTIVE_DATE", sc.next());
                order.put("CARD_EXPIRED_DATE", sc.next());
                // used later in program
                request = sc.next();
                order.put("REQUEST", request);
                orders.add(order);
                // count number of orders
                orderCtr++;
            }
            sc.close();
        }
        scan.close();
        log.info("Scanning complete");
        // finds if the trailer contains the correct value and order amount
        boolean ok = true;
        if (!trailer.contains(Integer.toString(valueCtr))) {
            ok = false;
        }
        if (!trailer.contains(Integer.toString(orderCtr))) {
            ok = false;
        }
        // if the trailer doesnt, throw error
        if (!ok) {
            log.error("Error in loadOrders: Order Count
and/or total value of file n does not match trailer amounts");
            response = new SimpleEntry<String, String>("ERROR",
                    "Order Count and/or total value of file n does 
not match trailer amounts");
            return response;
        }
        String className = "oracle.jdbc.driver.OracleDriver";
        Class.forName(className);
        con = DriverManager.getConnection(Env.getCardUrl(),
                Env.getCardUser(), Env.getCardPass());
        log.info("Starting insertion statement");
        String query = "SELECT MAX(BATCH_ID) + 1 FROM INTEGRATION.OL_ORDER";
        st = con.prepareStatement(query);
        rs = st.executeQuery();
        rs.next();
        int batch = rs.getInt(1);
        String insert = "INSERT INTO INTEGRATION.OL_ORDER ("
                + "BATCH_ID, "
                + "CLIENT_CUSTOMER_ID, "
                + "FIRST_NAME, "
                + "LAST_NAME, "
                + "ADDRESS1, "
                + "ADDRESS2, "
                + "CITY, "
                + "STATE, "
                + "POSTAL_CODE, "
                + "PHONE, "
                + "EMAIL_ADDRESS, "
                + "STORE_NUMBER, "
                + "DELIVERY_METHOD, "
                + "REWARD_VALUE, "
                + "CARD_ACTIVE_DATE, "
                + "CARD_EXPIRED_DATE, "
                + "REQUEST,"
                + "PASSPHRASE, "
                + "ITEM_CODE, "
                + "CONFIRMED_MAILADDR, "
                + "JET_CLIENT_ID) VALUES(?, ?, ?, ?, ?, ?, ?, 
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        st = con.prepareStatement(insert);
        log.info("Insertion complete, reorganizing data");
        // add batch
        for (HashMap<String, String> o : orders) {
            st.setInt(1, batch);
            // first, last, address1, address2, city, state, postal, phone,
            // storenum, delivery
            // validation and formatting
            ArrayList<String> content = validateContent(
                    o.get("FIRST_NAME"), o.get("LAST_NAME"),
                    o.get("ADDRESS1"), o.get("ADDRESS2"), o.get("CITY"),
                    o.get("STATE"), o.get("POSTAL_CODE"), o.get("PHONE"),
                    o.get("STORE_NUMBER"), o.get("DELIVERY_METHOD"));
            st.setString(2, o.get("CLIENT_CUSTOMER_ID"));
            st.setString(3, content.get(0));
            st.setString(4, content.get(1));
            st.setString(5, content.get(2));
            st.setString(6, content.get(3));
            st.setString(7, content.get(4));
            st.setString(8, content.get(5));
            st.setString(9, content.get(6));
            st.setString(10, content.get(7));
            st.setString(11, o.get("EMAIL_ADDRESS"));
            st.setString(12, content.get(8));
            st.setString(13, content.get(9));
            st.setInt(14, Integer.parseInt(o.get("REWARD_VALUE")));
            st.setDate(15, stringToDate(o.get("CARD_ACTIVE_DATE")));
            st.setDate(16, stringToDate(o.get("CARD_EXPIRED_DATE")));
            st.setString(17, o.get("REQUEST"));
            st.setString(18, getRandom());
            st.setString(19, "17331-000002");
            st.setString(20, "0");
            st.setInt(21, 97);
            st.addBatch();
        }
        st.executeBatch();
        log.info("Reorganization complete");
        response = new SimpleEntry<String, String>(Integer.toString(batch),
                request);
    } catch (Exception e) {
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        String temp = errors.toString();
        log.fatal("Error inside loadOrders(): " + temp);
        return null;
    } finally {
        Dir.close(rs, st, con);
    }
    return response;
}

Dir.close的代码:

public static void close(ResultSet rs, Statement ps, Connection conn) {
    Logger logger =LogManager.getLogger("AE");
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {
            logger.error("The result set cannot be closed.", e);
        }
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) {
            logger.error("The statement cannot be closed.", e);
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
            logger.error("The data source connection cannot be closed.", e);
        }
    }
}

正如我在上一条评论中提到的,JAR在web应用程序的类上,这意味着错误不可能由缺乏驱动程序引起。显然,在部署我的WAR文件时,tomcat引用的是一个较旧的WAR文件,或者是一些没有使用我上面发布的代码更新的代码。在导出WAR文件并将其重命名为任意名称并在该名称下部署之后,我不再得到错误了。另外需要考虑的是前一个war文件中代码的混乱;我没有正确关闭PreparedStatement、Result甚至Connection变量。使用上面发布的代码用不同的名称更新war。

最新更新