繁体   English   中英

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

[英]IO Error: Got minus one from a read call

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

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

数据库看起来像这样:

数据库

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

现在这里有奇怪的部分:

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

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

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

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

我想这可能是问题所在

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM