IO错误:从读取调用中减去一个

时间:2014-04-28 17:54:58

标签: java database multithreading oracle jdbc

我的时间和想法已经不多了。我需要使用Java和Oracle数据库进行预订整个飞机的模拟。

我们有一些关于如何做和预期的指示,但我们的代码仍然存在这种奇怪和意外的行为。

数据库如下所示:

Database

我们需要有一个不断运行的线程池来模拟10个同时尝试预订飞机的用户。线程结束时,另一个线程取代它。一些线程必须立即(随机机会)保留和预订。其他人会保留,然后决定是否要预订。如果他们决定等待然后预订另一个线程可能会在此期间保留,这意味着该线程将丢失该预留并将终止。它也可以等待一段延长的时间,在此期间它将被视为超时。

现在这里是奇怪的部分:

  1. 然后它告诉我标题的错误。
  2. 然后它向我展示HelperClass.java关于检查是否所有内容都被预订的信息(包含在下面)。
  3. 来自Master.java

    public static void main(String[] args) throws InterruptedException, ExecutionException {
    
        long start = System.nanoTime();
        Random r = new Random(start);
        ExecutorService pool = Executors.newFixedThreadPool(10);
        int threadsStarted = 0;
        List<Future<Integer>> results = new ArrayList<>();
        do {
            // TODO: Check for available seats left
            long id = r.nextLong();
            Future<Integer> submit = pool.submit(new UserThread(id));
            results.add(submit);
            threadsStarted++;
            id++;
        } while (!HelperClass.isAllBooked("CR9"));
    
        pool.shutdown();
    

    来自HelperClass.java

    public static boolean isAllBooked(String plane_no) {
        String sql = "SELECT * FROM SEAT WHERE plane_no=?";
    
        try(Connection conn = getConnection("db_010", "db2014");
                PreparedStatement st = conn.prepareStatement(sql)) {
            st.setString(1, plane_no);
            ResultSet rs = st.executeQuery();
            while (rs.next()) {
                int i = rs.getInt("BOOKED");
                if (rs.wasNull()) {
                    return false;
                }
            }
        } catch (SQLException ex) {
            System.out.println("[HELPER CLASS] SQL ERROR: " + ex.getMessage());
        }
        return true;
    }
    

    为了不用一步一步的代码填写这篇文章,我只是停在这里,如果您需要更多内容来查看此代码中的问题,我将提供。请注意,这是原型代码,不应该是非常安全或遵循地球上的每个代码伦理。

    完整筹码:

    [HELPER CLASS] SQL ERROR: IO Error: Got minus one from a read call
    Exception in thread "main" java.lang.NullPointerException
        at dbassignment4.HelperClass.isAllBooked(HelperClass.java:50)
        at dbassignment4.Master.main(Master.java:36)
    apr 28, 2014 8:02:59 PM dbassignment4.UserThread getConnection
    SEVERE: null
    java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
        at java.sql.DriverManager.getConnection(DriverManager.java:579)
        at java.sql.DriverManager.getConnection(DriverManager.java:221)
        at dbassignment4.UserThread.getConnection(UserThread.java:76)
        at dbassignment4.UserThread.reserve(UserThread.java:63)
        at dbassignment4.UserThread.call(UserThread.java:35)
        at dbassignment4.UserThread.call(UserThread.java:21)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
    Caused by: oracle.net.ns.NetException: Got minus one from a read call
        at oracle.net.ns.Packet.receive(Packet.java:314)
        at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:153)
        at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
        ... 15 more
    
    BUILD STOPPED (total time: 36 seconds)
    

2 个答案:

答案 0 :(得分:1)

  1. 您正在获得IO异常。 this的可能原因。您的服务器没有响应。如果它已经工作通过一些工具检查连接(sqlplus / toad / tns),如果一切正常,你可以重试(如果数据源涉及重新建立/刷新状态)

  2. 似乎您正在使用getconnection()方法在助手类中获得连接。您可以在其中除了连接和执行某些操作。您在getConnection方法中获得Null指针异常。你必须告诉我们给出Nullpointer的原因。

  3. 最后,您可以简单地编写查询以返回true / false,如果任何一个座位没有预订而不是迭代所有结果,并在找不到预订时停止。

答案 1 :(得分:-1)

我认为这可能是问题

    ResultSet rs = st.executeQuery();
    while (rs.next()) {
        int i = rs.getInt("BOOKED");
        if (rs.wasNull()) {
            return false;
        }
    }

如果rs为NULL,那么你在null上调用getInt,导致NPE