2015-03-18 4 views
1

Есть ли другой способ правильно закрыть соединение с базой данных доступа ms в конце бесконечного цикла? Потому что, если запись вставлена ​​в таблицу, с моим кодом ниже, я не вижу новых вставленных строк/строк. Похоже, что база данных не закрывается по-разному или что-то ... не знаю, почему она действует так. Если я вручную закрываю или открываю базу данных (моя программа все еще работает в фоновом режиме), все в порядке - новая строка/строки появятся в моем запросе.Java, взаимодействующий с базой данных ms, - ucanaccess

import java.rmi.RemoteException; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class Main { 

    public static void main(String[] args) throws RemoteException, 
      InterruptedException, SQLException { 
     while (true) { 
      Connection con = DBConnection.getDBConnection(); 
      System.out.println("Connection OK!"); 
      Statement s = null; 

      try { 
        ResultSet rs = null; 
        con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
        con.setAutoCommit(true); 
        rs = s.executeQuery("SELECT Tel, Msg, Procesat FROM RcvMsg WHERE Procesat = 'NOK'"); 

        while (rs.next()) 
        { 
         String pn = rs.getString(1); 
         String str = rs.getString(2); 
         //do something 
        } 
        rs.close(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
        } finally { 
         s.close(); 
         con.close(); 
        } 

      Thread.sleep(5000); 
     } 
    } 
} 
+0

Что вы пытаетесь сделать в '// do something' ?? –

+0

Ничего релевантного. Скажем, что-то печатаю. Дело в том, что моя программа не может видеть новые вставки во время работы программы - просто при закрытии/открытии базы данных вручную. – mamba

+0

Я не могу воссоздать вашу проблему с помощью UCanAccess 2.0.9.4. Мой тестовый код [здесь] (http://pastebin.com/sXx9L3zc). Когда я добавляю новую строку из другого приложения (VBScript с использованием OLEDB) во время работы моего приложения Java, он отображает новую строку на следующей итерации через цикл while (true). Если вы используете более старую версию UCanAccess, попробуйте перейти на [последнюю версию] (http://sourceforge.net/projects/ucanaccess/files/). –

ответ

0

Если вы установите AutoCommit ложь (что приведет к отключению автоматического совершения) следует вызвать Connection.commit() вручную, в противном случае ничего не будет когда-либо в конечном итоге постоянно в базе данных.

+0

Я установил autocommit в true, все равно никаких изменений :( – mamba

0

Вы устанавливаете Auto Commit false. Установите значение true. Затем ваши изменения будут отображаться постоянно или по умолчанию, новые подключения находятся в режиме автоматической фиксации, поэтому вы можете удалить эту строку.

+0

Я обновил свой код и попробовал его ... все тот же, программа не увидит новые строки. Я также обновил свой код в вопросе. – mamba

+0

Можете ли вы обновить код с вашим запросом на вставку, который вы используете? –

+0

Или вы можете попытаться создать оператор вроде this con.createStatement(); –

1

Код, который вы показываете, является правильным, но абсолютно неуместным для вас проблемой, потому что вы просто читаете. Как вы вставляете записи? Вручную с доступом, используя другой процесс (отличный от java-процесса)? В этом случае ucanaccess сможет считывать эти новые данные, когда они физически хранятся в файле доступа (и это может произойти при закрытии таблицы в доступе и всегда при закрытии базы данных).

Кроме того, если вы вставили данные с другим потоком (отличным от этого в опросе), вы увидите все вставленные записи (без какой-либо очевидной проблемы с задержкой).

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