2012-04-13 3 views
0

У меня есть это:Создать временную таблицу в MySQL из Java

public static void createTemporaryTable() { 
     Statement s = null; 
     sentence = "CREATE TEMPORARY TABLE Book (ISBN int NOT NULL, " + 
       "title varchar(45), author varchar(45), price double, PRIMARY KEY (`ISBN`));"; 

     try { 
      s = Conexion.getInstancia().createStatement(); 
      s.executeUpdate(sentence); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       s.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Тогда:

public class System { 

    public static void main(String[] args) { 
     SqlSentencesList.createTemporaryTable(); 
    } 

} 

Но когда я исполню select * from Book, MySQL говорит мне Book таблица не существует. Я не получаю никаких сообщений об ошибках из java, поэтому таблица должна быть создана, но это не так.

Если я выполняю одно и то же предложение sql для создания временной таблицы непосредственно в mysql, он отлично работает.

Это мой Conexion класс:

public class Conexion { 

    private static Connection conexion = null; 



    private Conexion() { 

    } 

    public static Connection getInstancia() { 
     if (conexion == null) { 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       conexion = DriverManager.getConnection(
         "jdbc:mysql://localhost/Esquema_VentaLibros","gustavo", "123581321"); 

      } catch (SQLException sqlex) { 
       sqlex.printStackTrace(); 
      } catch(ClassNotFoundException cnfex) { 
       cnfex.printStackTrace(); 
      } 
      return conexion; 
     } 
     else { 
      return conexion; 
     } 
    } 

} 
+0

Используете ли вы одного пользователя при попытке запроса непосредственно в MySQL и в своем приложении? –

ответ

1

Временные таблицы автоматически удаляются, когда соединение закрывается.

См MySQL CREATE TABLE документации для деталей:

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только для текущего соединения и автоматически отбрасывается при закрытии соединения. Это означает, что два разных соединения могут использовать одно и то же имя временной таблицы, не конфликтуя друг с другом или с существующей таблицей без ТЕМПОРЕЙТА с тем же именем. (Существующая таблица скрыта, пока временная таблица не отбрасываются.)

Если вы хотите создать временную таблицу, чтобы сделать какую-то работу, вы должны создать его, когда вы начинаете свою работу, и выполнить свой UPDATE/SELECT заявления против него. Он автоматически отключится при закрытии вашего соединения и не будет конфликтовать с другими соединениями, используя одно и то же имя временной таблицы.

+0

Но я не закрываю соединение. –

+0

Где вы выполняете свой 'SELECT * FROM Book'? Я не вижу этого в вашем основном методе. Если вы получаете то же соединение из 'getInstancia()', то оно должно быть все еще видимым. Но если вы получите доступ к БД из командной строки mysql или другой программы, это не произойдет. – Jonathan

1

Временные таблицы для подключения к базе данных. Поэтому, если вы пытаетесь получить доступ к временной таблице из другого соединения, вы ее не увидите.

+0

Итак, если я выполняю 'select * from Book' с Java, он должен работать нормально, не так ли? –

+0

Зависит от того, как вы обрабатываете подключения к базе данных. Открываете ли вы новый перед каждым запросом? У вас есть пул соединений, а 'Conexion.getInstancia()' получает случайный из них? Каждый из этих сценариев может привести к использованию разных соединений при создании временной таблицы и при попытке получить к ней доступ. –

+0

Я просто закрываю заявление, но не соединение. Я положу класс 'Conexion'. –

Смежные вопросы