【问题标题】:After end of result set结果集结束后
【发布时间】:2014-07-30 08:29:26
【问题描述】:

我有 sql 查询,我在 MysqlWorkBench 中运行,结果如下:

order_id, customer_id,          date,          product_id, quantity
  '1',        '1',      '2014-07-30 01:20:46',    '1',         '7'
  '1',        '1',      '2014-07-30 01:20:46',    '2',         '3'
  '1',        '1',      '2014-07-30 01:20:46',    '3',         '2'
  '1',        '1',      '2014-07-30 01:20:46',    '7',         '1'

现在我正在尝试在我的应用中获得相同的结果,这是代码

 public synchronized List<Order> getAllOrders() throws DatabaseException{                                      
List<Order> orders = new ArrayList<>();
Connection connection = null;
PreparedStatement statement = null;
ProductDao productDao = new ProductDao();
try{
    try {            
        connection = ConnectionPool.getInstance().getConnection();            
        statement = connection.prepareStatement("SELECT order_id,customer_id,`date`,product_id,quantity FROM 4elements.purchase as r INNER JOIN product_in_order d ON r.id = d.order_id");                        
        ResultSet result = statement.executeQuery();            

        while (result.next())
        {
            Order order = new Order(); 
            int i = 1;
            order.setId(result.getInt(i++));
            order.setCustomerId(result.getInt(i++));              
            order.setDate(result.getTimestamp(i++));                
            int productId = result.getInt(i++);
            Item item = new Item(productDao.getProduct(productId));
            item.setQuantity(result.getInt(i++));
            orders.add(order);               
        }            
    }
    finally{                                        
        closePreparedStatement(statement);
        returnConnection(connection);                    
    } 
    return orders; 
}

如果很重要,我会使用我自己的ConnectionPool(这是任务的一部分)。 当我尝试获取第一个 int 时,我得到 "After end of result set" 异常。 我尝试使用 Statement 而不是 PreparedStatement - 同样的例外。 我还尝试通过列名获取结果,在这种情况下,我只能从结果中获取第一个 int - 但仍然出现异常。

请有人告诉我有什么问题吗?

这里是堆栈跟踪:

   30-Jul-2014 11:47:05.110 INFO [http-apr-8080-exec-377] org.apache.catalina.util.LifecycleBase.start The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/WebApp4Epam]] after start() had already been called. The second call will be ignored.
   java.sql.SQLException: After end of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:850)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2705)
at dao.OrderDao.getAllOrders(OrderDao.java:64)
at command.GetOrdersCommand.execute(GetOrdersCommand.java:28)
at command.AdminLoginCommand.execute(AdminLoginCommand.java:31)
at controller.ControllerServlet.processRequest(ControllerServlet.java:51)
at controller.ControllerServlet.doPost(ControllerServlet.java:42)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at filters.EncodingFilter.doFilter(EncodingFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)

--添加--

我在不同的桌子上尝试了以下其他 从客户中选择 *

            statement = connection.prepareStatement("SELECT * FROM CUSTOMER");                                                                
            result = statement.executeQuery();                 
            if (result.next()){
                customer = new Customer();                   
                customer.setId(result.getInt("id")); //I get an exception in that line
                customer.setFirstName(result.getString("first_name"));
                customer.setSecondName(result.getString("second_name"));                
            }

然后得到结果,但它仍然给我一个例外。
有什么想法吗?

【问题讨论】:

  • 请向我们展示用于检索示例中这 4 行的初始查询!
  • 如果数据显示为'1' 那么这是否意味着它是一个字符串而不是一个整数
  • 异常到底是在哪里抛出的?发布堆栈跟踪!
  • @Albus:发布抛出的异常并在下方发表评论
  • @NishanthiGrashia 已添加。

标签: java mysql sql jdbc


【解决方案1】:

我注意到您在使用后没有关闭结果集,但您似乎返回了数据库连接并在其他地方使用它。

来自javadocs

Statement 对象关闭时,它的 当前ResultSet 对象,如果有的话 存在,也关闭了。

但是由于您似乎使用自定义方法来关闭语句,所以我不知道您在其中做了什么。如果您以某种方式未能关闭语句并仍然返回连接池,您可能会遇到问题。

我建议检查所有代码并在使用后关闭所有结果集,问题可能会消失。

【讨论】:

  • result.beforeFirst() 没有帮助。
  • 看到堆栈跟踪后改变了我的答案,看看这是否有帮助
  • 不,我用其他方法关闭语句。
  • 你终于说对了,我没有关闭项目其他部分的 ResultSet 对象。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2014-05-25
  • 2022-12-06
  • 2011-04-19
相关资源
最近更新 更多