我的时间和想法已经不多了。我需要使用Java和Oracle数据库进行预订整个飞机的模拟。
我们有一些关于如何做和预期的指示,但我们的代码仍然存在这种奇怪和意外的行为。
数据库如下所示:
我们需要有一个不断运行的线程池来模拟10个同时尝试预订飞机的用户。线程结束时,另一个线程取代它。一些线程必须立即(随机机会)保留和预订。其他人会保留,然后决定是否要预订。如果他们决定等待然后预订另一个线程可能会在此期间保留,这意味着该线程将丢失该预留并将终止。它也可以等待一段延长的时间,在此期间它将被视为超时。
现在这里是奇怪的部分:
来自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)
答案 0 :(得分:1)
您正在获得IO异常。 this的可能原因。您的服务器没有响应。如果它已经工作通过一些工具检查连接(sqlplus / toad / tns),如果一切正常,你可以重试(如果数据源涉及重新建立/刷新状态)
似乎您正在使用getconnection()方法在助手类中获得连接。您可以在其中除了连接和执行某些操作。您在getConnection方法中获得Null指针异常。你必须告诉我们给出Nullpointer的原因。
最后,您可以简单地编写查询以返回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