Вызов rs.next()
перемещает курсор к следующей записи и возвращает true, если она была, или false, если ее не было.
Проблема в том, что в каждом цикле вы вызываете rs.next()
дважды.
Если вы удалите дополнительный вызов и очистите другой код:
while (rs.next()) {
int productId = rs.getInt("product_id");
System.out.println(productId);
}
... это решит как вашу проблему пропуска каждой второй записи, так и чтения после конца набора результатов.