Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:未找到适用于jdbc:oracle:thin的驱动程序_Java_Sql_Oracle_Jdbc - Fatal编程技术网

java.sql.SQLException:未找到适用于jdbc:oracle:thin的驱动程序

java.sql.SQLException:未找到适用于jdbc:oracle:thin的驱动程序,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我目前有一个web应用程序,其中某些类可以连接到我的数据库,但另一个类不能。无论出于何种原因,我的一个类开始出现此异常。以下是我所做的: 我正在使用Java7,在我的类路径和lib文件夹中都有ojdbc7 我有多个类可以连接到url文件,但我的另一个类不能并抛出“java.sql.SQLException:找不到适合jdbc的驱动程序:oracle:thin:@someurl” 在我在另一个类中连接到数据库后,我的类可以访问该数据库 我有一个包含URL的config.properties文件,因

我目前有一个web应用程序,其中某些类可以连接到我的数据库,但另一个类不能。无论出于何种原因,我的一个类开始出现此异常。以下是我所做的:

  • 我正在使用Java7,在我的类路径和lib文件夹中都有ojdbc7
  • 我有多个类可以连接到url文件,但我的另一个类不能并抛出“java.sql.SQLException:找不到适合jdbc的驱动程序:oracle:thin:@someurl”
  • 在我在另一个类中连接到数据库后,我的类可以访问该数据库
  • 我有一个包含URL的config.properties文件,因此我知道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;
    }
    

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

    您能澄清一下OJDBC JAR的位置吗?它是在WAR中还是在web服务器的lib目录中?您是说只有在调用
    Class.forName(“oracle.jdbc.driver.OracleDriver”)
    时,数据库连接代码才有效?如果是这样,那么如果您使用的是4.0之前的JDBC驱动程序,这听起来像是预期的行为。请参阅。@Tim在战争中,对不起。@Tim不,这不是问题所在。什么代码无法加载URL的驱动程序?你能发那个密码吗?(根据您的评论,我了解到,
    loadOrders()
    成功连接,而其他一些代码失败,因此如果这不正确,请澄清哪些代码成功,哪些代码失败,并将两者都发布。)
    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);
            }
        }
    }