Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Java Базы данных (JDBC, JPA, Hibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 09.12.2019, 17:55   #1
Sneshok
Новичок
Джуниор
 
Регистрация: 09.12.2019
Сообщений: 1
По умолчанию Обновить данные в mdb (Access)

Добрый день.
Необходимо обновить данные в mdb файле, но файл на 3-4 миллиона строк и выкидывает ошибку на нехватку памяти.

Код:
Connection conn = DriverManager.getConnection
                ("jdbc:ucanaccess://D:/Conv2/test.mdb;memory=false", null, null);
         String sql = "UPDATE items SET col = 3";
         System.out.println("conn rdy");
         PreparedStatement st = conn.prepareStatement(sql);
         System.out.println("st rdy");
         st.execute();
         conn.close();
Сварганил вот такой код, но по сути это перенос из одного файл в другой, с добавлением данных в нужное поле.

Код:
String columnName = "";
        String forSqlData = "";
        String sqlData = "";
        int i,y,columnDate=0;
        final int batchSize = 100000;
        int count = 0;
        PreparedStatement pst;
        // UCanAccess
        try { Connection conn = DriverManager.getConnection
                ("jdbc:ucanaccess://D:/Conv2/test.mdb;memory=false", null, null);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM items WHERE 0=1");
            ResultSetMetaData rsmd = rs.getMetaData();
            System.out.println("Column names as reported by ResultSetMetaData:");
            for (i = 1; i <= rsmd.getColumnCount(); i++) {
                if (rsmd.getColumnName(i).equals("col")) {
                    columnDate=i;
                }
                columnName=columnName+rsmd.getColumnName(i)+",";
                forSqlData = forSqlData+"?,";
                }
            columnName = StringUtils.substring(columnName, 0, columnName.length() - 1);
            sqlData = "INSERT INTO items ("+columnName+") values("+forSqlData;
            sqlData = StringUtils.substring(sqlData, 0, sqlData.length() - 1);
            rs.close();
            String sql = "SELECT * FROM items";
            ResultSet rst = stmt.executeQuery(sql);
            conn = DriverManager.getConnection
                    ("jdbc:ucanaccess://D:/Conv2/test2.mdb;memory=false", null, null);
            pst = conn.prepareStatement(sqlData+")");
            while (rst.next()) {
                y=1;
                while(y<i) {
                    if (y==columnDate) {
                            pst.setString(y, "777");
                            } 
                            else
                            {
                            pst.setString(y, rst.getString(y));
                            }
                y++;            
                }
                pst.addBatch();
                if(++count % batchSize == 0) {
                    pst.executeBatch();
                }
            }
            pst.executeBatch();
            rst.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace(System.out);
        }
Плюс проблема еще в том, что коннект в базе долги, около минуты.
Второй код с базой в 5 столбцов и 4.5 миллионов записей выполняется 7-8 минут, что достаточно долго, так же столкнулся с проблемой совместимости типов в первой и второй базе.
Если я что-то делаю не так, то с радостью узнаю как сделать правильно, спасибо.
Sneshok вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновить форму Access qsv1991 Помощь студентам 6 13.10.2012 20:12
Обновить данные в DataGridView. Как верно? Genco Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 20.04.2011 08:23
Обновить данные в DBGRID sl963 БД в Delphi 7 04.06.2010 18:06
Обновить табличные данные в Exel Прохор Microsoft Office Excel 6 27.04.2010 16:18
Delphi:обновить данные в таблице. Raccoon Помощь студентам 5 19.05.2008 19:31


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS