powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Насколько разумен/корректен такой код: сжатие и восстановление БД?
8 сообщений из 8, страница 1 из 1
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164780
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть БД, с ней работают
1) exe1.exe 2) exe2.exe
БД не очень сложная, но как водится имеет свойство разрастаться, поэтому скажем так желательно ее периодически сжимать.
Придумывать всякие "раз в неделю" или спец.кнопку в проге - лениво стало.
Потом с БД работают больше одного exe, а в момент сжатия БД должна быть "не открыта".
Придумал так: каждый раз при загрузке только exe1 , exe1 пытается ее сжать.
Получится -хорошо, не получится (если вдруг exe2 запущена)-ну и бес с ним,my_JRO.CompactDatabase по ошибке перескакивает код, в другой раз м.б. получится.
Насколько хороши сама идея такого подхода (на авось) и сам код?
Не очень ли это безобразно все? Меня повторюсь здесь интересует СЖАТИЕ и то как я это реализовываю.
Не лишний ли backup и есть ли в нем смысл? Не излишество ли сжимать БД каждый раз, пусть даже и не каждый раз это получится? Не наживу ли я лишних ошибок с таким подходом? Не рискую ли вообще потерять данные, если что не так пойдет?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Option Explicit

Public my_JRO 'As JRO.JetEngine
Public adoConn 'As ADODB.Connection
Public LogPath As String
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" _
  (ByVal lpFileName As String) As Long
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _
  (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
...

Private Sub Command2_Click()
    DataBaseConnect
    MsgBox "done!"
    DataBaseDisConnect
End Sub

Sub DataBaseConnect()
    LogPath = App.Path & "\log"
    'создаем пустую БД, если БД отсутствует
    If Len(Dir(LogPath & "\test.mdb")) =  0  Then
        CreateDatabase
    End If
    'Set my_JRO = New JRO.JetEngine
    Set my_JRO = CreateObject("JRO.JetEngine")
    '----------------------------------------------
    'здесь мы "сжимаем и восстанавливаем" БД, код сработает только если другой компонент приложения
    'не взаимодействует с БД в текущий момент, т.е. характер процедуры-случайный
    'удаление временного файла(если вдруг существует)
    DeleteFile LogPath & "\test_tmp.mdb"
    'удаление предыдущего backup, если существует
    DeleteFile LogPath & "\test_backup.mdb"
    'резервирование оригинала (по-любому)
    CopyFile LogPath & "\test.mdb", LogPath & "\test_backup.mdb", False
    On Error GoTo not_compact
   'сжатие БД во временный файл, если вдруг БД "занята", то сжатие произведено не будет и продолжим работу
    'с предыдущей несжатой версией БД
    my_JRO.CompactDatabase _
      "Provider=Microsoft.Jet.OLEDB.4.0;" _
      & "Data Source=" & LogPath & "\test.mdb;Jet OLEDB:Database Password=testtest", _
      "Provider=Microsoft.Jet.OLEDB.4.0;" _
      & "Data Source=" & LogPath & "\test_tmp.mdb;Jet OLEDB:Database Password=testtest"
    If Len(Dir(LogPath & "\test_tmp.mdb")) >  0  Then 'а вдруг он не создался?
        'удаление оригинала
        DeleteFile LogPath & "\test.mdb"
        'перемещение сжатого файла в оригинал
        CopyFile LogPath & "\test_tmp.mdb", LogPath & "\test.mdb", False
        'удаление временного файла
        DeleteFile LogPath & "\test_tmp.mdb"
    End If
not_compact:
    '----------------------------------------------
    Set adoConn = CreateObject("ADODB.Connection") 'New ADODB.Connection
    adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
      LogPath & "\test.mdb;Mode=Share Deny None;Persist Security Info=False;Jet OLEDB:Database Password=testtest"
End Sub
Public Sub DataBaseDisConnect()
    adoConn.Close
    Set adoConn = Nothing
End Sub
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164797
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу смысла сжимать базу вообще. Она не имеет тенденцию разрастаться бесконечно. Очень условно говоря, если у тебя в какой-то момент данных (с индексами и пр.) на 100Мб, база будет колбаситься в районе размер 120Мб (и то, если ты интенсивно используешь удаление данных или апдейты с увеличением размера данных) за счет того, что в ней будут освобожденные и ПОКА не занятые страницы.

Сжав базу ты получишь свои 100Мб, которые очень быстро вернутся к 120Мб и опять будут жить в этом размере.
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164838
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Хочешь сказать, что вообще надо убрать этот код из основного приложения?
Ну а вред от него есть?
Ну можно конечно вынести в отдельную утилиту, а в help-е написать "шо делать, если хочешь сжать".

Понимаешь, я уже когда-то работал "в проекте, кот. типа для внутр. пользования" с такой моделью.
При таблице в 10000 записей и долбеже 10-ю процессами (каждый процесс обращается к БД скажем раз в минуту -эту минуту "работает" с одной строчкой), после суток разрастание было не плохое и торможение заметное. Там раза 4 в сутки авто-перегружал комп (Win2003! он сильно стабильнее чем XP!!!) и сжимал после перезагрузки (не тем простым кодом с JRO что счас нарыл, а каким-то более длинным -не помню-не суть)

Счас у меня на тесте 1500 записей в двух осн. таблицах, размер в сжатом состоянии около 600кб (не уверен что мне нужно стремиться к 100МБ и это есть good). У среднестатистического юзера этих записей будет много меньше. Однако если пользователь решит использовать систему "по полной" типа как это делал я в примере выше (умный такой обязательно найдется), то у него будет записей поболе чем 2000.
На указанных 1500 сжатие проходит мгновенно, и согласен -не больно то и нужно.
Ну а если 100000 записей, с одной стороны сжимать все же нужно, а с другой - не даст ли мой код сильный тормоз в form_load.
Там проблема в том еще, что приложение "сильно динамическое", параллельных процессов может быть скажем 50 (хотя это де-факто маловероятно), и тормоза точно не нужны, а при "хаотично-сформированной БД" они насколько я понимаю, таки могут иметь место быть.

Т.е. мне хочется этот код-таки оставить и именно как сделал. Кроме того что "зачем ее вообще сжимать", с учетом рассуждений про долгий "form_load" при большом объеме, можно к нему придраться?
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164840
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Как ты правильно заметил, теряем скорость загрузки. Возможно прилично (опять же учесть резервирование базы).
А вот что находим - я так и не понял.

Если просто "хочется" - оставляй. К коду вроде претензий нет.

ЗЫ: Что-то я не понял про автоперезагруз компа, бред какой-то. Что 10к, что 100к записей и 10 пользователей - это смешные цифры даже для mdb, и если это приводило к необходимости перезагрузки компа, что-то не так было с клиентом, а отнюдь не с базой.
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164852
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>теряем скорость загрузки. Возможно прилично (опять же учесть резервирование базы).
Да вряд ли мы сильно потеряем, если пара-тройка мегов. Так может и не нужно лишнее backup-копирование? Если оно и спотыкается, то только на сжатии, собственно на этом спотыке и основана идея обойти сжатие, если оно в данный момент невозможно.
Впрочем если не поленюсь, проверю, благо код/debug который считает мс у меня в этот екзешник встроен.
>ЗЫ: Что-то я не понял про автоперезагруз компа, бред какой-то.
Не бред, там "клиенты" еще сильно грузили.
Но БД кажется тоже тормозила. Но там еще таблицы часто пересчитывались через запросы+, система была сильно навороченная и "на карачиках", но при всем том уникальна в своем роде и работу делала.

> а отнюдь не с базой.
грузила, клиент "долго думал", пока читал запись.
Но бог с ним... Таблица в самом Access по сети "долго открывалась" после утомления.
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164860
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>теряем скорость загрузки.

Код: plaintext
 15 . 03 . 2011   3 : 12 : 54 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 12 : 54 \t 78 \tafter_compact\n 15 . 03 . 2011   3 : 13 : 15 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 13 : 15 \t 93 \tafter_compact\n 15 . 03 . 2011   3 : 13 : 19 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 13 : 19 \t 93 \tafter_compact\n 15 . 03 . 2011   3 : 13 : 22 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 13 : 22 \t 93 \tafter_compact\n 15 . 03 . 2011   3 : 13 : 41 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 13 : 41 \t 78 \tafter_compact\n 15 . 03 . 2011   3 : 13 : 46 \t 0 \tbefore_compact\n 15 . 03 . 2011   3 : 13 : 46 \t 93 \tafter_compact

Критично ?

Если сравнивать с чтением этой же базы то время на сжатие в 3-4 раз меньше.
(172+140)/93=3.35
/topic/822258&hl=
Код: plaintext
P2Duo-XP (Baza)\n 21 . 01 . 2011   8 : 19 : 53 \t 0 \tRe/Loading Inbox table into ListView (start)\n 21 . 01 . 2011   8 : 19 : 53 \t 140 \tRe/Loading Inbox table into ListView (end)\n 21 . 01 . 2011   8 : 19 : 53 \t 0 \tRe/Loading Outbox table into ListView (start)\n 21 . 01 . 2011   8 : 19 : 53 \t 172 \tRe/Loading Outbox table into ListView (end)\n 21 . 01 . 2011   8 : 19 : 59 \t 0 \tRe/Loading Outbox table into ListView (start)\n 21 . 01 . 2011   8 : 19 : 59 \t 172 \tRe/Loading Outbox table into ListView (end)\n 21 . 01 . 2011   8 : 20 : 01 \t 0 \tRe/Loading Inbox table into ListView (start)\n 21 . 01 . 2011   8 : 20 : 01 \t 141 \tRe/Loading Inbox table into ListView (end)
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37164862
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Так может и не нужно лишнее backup-копирование?
Убрал я про _backup.mdb
Что то не припомню чтоб за 5 лет работы вышеупомянутой системы я этим когда-либо воспользовался и потерял базу, мусор только разводить. Не говоря о том, что будучи выполнена дважды даже в случае потери базы при первой итерации, после второй итерации уже ничем не поможешь.
...
Рейтинг: 0 / 0
Насколько разумен/корректен такой код: сжатие и восстановление БД?
    #37165116
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> >Так может и не нужно лишнее backup-копирование?
> Убрал я про _backup.mdb


А вот это зря. Со сжатием, я согласен с Шокером, смысла не вижу. А система бекапов должна быть обязательно, если данные
в базе представляют какую-то ценность. И то что раньше все было нормально, не дает никакой гарантии что так будет и
дальше.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Насколько разумен/корректен такой код: сжатие и восстановление БД?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]