powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate+большие таблицы как реализовать
7 сообщений из 7, страница 1 из 1
Hibernate+большие таблицы как реализовать
    #34075517
Sit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sit
Гость
Есть веб приложение в котором необходимо реализовать выборку из трех таблиц по запросу пользователя. Таблицы очень большие и поэтому при запросе пользователя каждый раз обращаться к SQL серверу накладно. Таблицы используються только для чтения. Возникла идея загружать все таблицы в приложение и работать с ними в приложении не обращаясь к SQL серверу. Для реализации этого решил использовать Hibernate. Посоветуйте можно ли такое реализовать на нем. Основаная задача разгрузить SQL сервер.
Таблицы большие от 9000 записей и до 30000. Пользователей будет приблизительно до 150 человек. Справится ли Hibernate с таким объемом.
Как алтернатива остается вызов хранимой процедуры на сервере которая пудет вызыватся при каждом обращении пользователя. Как луче сделать - подскажите.
Пуду очень благодарен любым советам и предложениям.
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34075617
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
9000 записей и до 30000.


Это одни из самых маленьких таблиц, никаких проблем при select'ах пусть даже из трех таблиц с такими проблемами быть не должно. Естественно если ты построил все необходимые индексы, ну и запрос у тебя написан не от балды.

А вообще да, хибер может повысить производительность за счет своего кэша, но тут, я практически уверен, можно обойтись и без кэширования данных хибером.


Пиши подробнее что у тебя за структура таблиц, какой запрос нужно так часто дергать.
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34075959
Sit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sit
Гость
Вот структура таблиц с индексами:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Таблица прав пользователей на подразделения

CREATE TABLE dbo.aPermGr (
    UID                             int                                      not  null 
  , iGr                             int                                      not  null 
  , NoRight                         char                            ( 1 )       null 
  )

add constraint pk_aPermGr primary key  clustered(UID, iGr) on "default"


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Справочник подразделений
 
CREATE TABLE dbo.main_gr (
    iGr                            smallint                                not  null 
  , Name                           varchar                        ( 100 )    not  null 
  , s_Kod                          varchar                        ( 10 )      null 
  , stored                          char                            ( 1 )       null 
  , hlev                           smallint                                 null 
  , is_filial                       char                            ( 1 )       null 
  , is_ru                           char                            ( 1 )       null 
  , is_nbu                          char                            ( 1 )       null 
  , Bizn                           smallint                                 null 
  , Bizn_iGr_Par                   smallint                                 null 
  , bizn_ns                         char                            ( 1 )       null 
  , gr                              char                            ( 2 )       null 
  , ru                              char                            ( 1 )       null 
  , Is_Otd                          char                            ( 1 )       null 
  , Is_TOBO                         char                            ( 1 )       null 
  , is_ukr                          char                            ( 1 )       null 
  , ibank                          smallint                                not  null 
  , BBN_BNMN                        char                            ( 2 )      not  null 
  , BFL_CNA                         char                            ( 2 )      not  null 
  )
add constraint PK_MAIN_GR primary key  nonclustered (iGr) on "default"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
История и структура подразделений

CREATE TABLE dbo.hist_gr (
    iGr_Par                        smallint                                not  null 
  , iGr                            smallint                                not  null 
  , iDat_od                         int                                      not  null 
  , Status                          char                            ( 1 )      not  null 
  )

add constraint PK_HIST_GR primary key  nonclustered (iGr_Par, iGr, iDat_od) on "default"

add constraint UK_HIST_GR unique  nonclustered (iGr, iGr_Par, iDat_od) on "default"

Самая интересная таблица здесь это история и стркутура подразделений hist_gr. Вней хранится состояние подразделения (работает/неработает - поле Status). А также по этой таблице определяется структура подразделений т.е. родитель==>ребенок. И самое главное поле это дата. Пользователь каждый раз пудет вводить дату на которую он хочет получить структуру и подразделение и надо посмотреть какие у пользователя есть доступные права в aPerm_gr потом раксрутить эти подразделения на определенную дату.

Привожу пример процедуры которая работала на SQL

Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
Create Proc dbo.wGet_AllGR_web (
	@User_name varchar( 25 ) = 'dn161184sav',
	@s_kod varchar( 255 ) = 'fiktiv',
	@dat_od datetime = '20061001',
	@min_hlev smallint =  10 ,
	@igr_par smallint =  1 ,
	@max_lev smallint =  0 ,
	@what_gr smallint =  null ,
	@with_shift  int  =  0 ,
	@show_all  int  =  0 
                               )
As
  Begin
/**********************************************************
*Procedure Name: wGet_AllGR_web
*Database: db_almaz
*Server: Avalon
*SQL-Builder4.3
*
*Business Function :    
Синтаксис: WGet_AllGr(    
    @What_Gr smallint =null ,   
    @dat_od datetime ,   
    @min_hlev smallint =0 ,   
    @max_lev smallint =0 ,   
    @s_kod varchar(255) =null)   
  
@What_Gr - не используется;   
@dat_od - дата;   
@min_hlev - минимальный уровень подразделения(main_gr)   
@max_lev - максимальный уровень в дереве подразделений;   
@s_kod - список подразделений (в строке с разделителями).   
Процедура позволяет получить перечень региональных подразделений в соответствии с их вхождением в региональные управления.   
  
  
  
  
  
  
  
*Author BF: ufr16		Date BF: 20/05/2005   
*
*********************************************************/
 
  
  
declare @idat_od  int    
select @idat_od=datediff(day,'18991230',@dat_od)   
/*if @dat_od>='20040701' and @s_kod='СК' begin --20.07.2004 12:00 BA   
   select @min_hlev=25   
   select @max_lev=30   
end    
*/    -- убрала  13  июня  2006  г. Н.Ю.   
create table #t(   
igr smallint,   
igr_par smallint,   
idat_od  int ,   
lev smallint  null ,   
ii  int   null ,   
s_kod varchar( 10 )  null  )   
  
create table #t1(   
igr smallint,   
igr_par smallint,   
idat_od  int ,   
lev smallint  null ,   
ii  int   null ,   
s_kod varchar( 10 )  null  )   
  
create table #g(   
  ii numeric( 8 , 0 ) identity ,   
  igr smallint,   
  igr_par smallint,   
  idat_od  int ,   
  lev smallint  null )   
  
declare    
  @lev smallint,   
  @i  int ,   
  @ws_kod varchar( 10 ),   
  @tmUID  int ,   
  @sKod varchar( 255 ),    
  @tGr  int ,   
  @tsKod varchar( 255 ),  
  @k  int , 
  @UID  int   
  
  
 if  not exists (select * from aUsers where name=@User_name)  return  
  
select @UID=(select UID from aUsers where name=@User_name)   
select @lev= 0    
  
create table #tm_igr(igr  int )   
select @tmUID=(select UID from ausers where UID=@UID)  
select @tsKod=@s_kod  
select @k= 0   
 while ( 1 = 1 ) begin   
   if  (@tmUID is  null )  break    
  
  if  @s_kod='fiktiv'    
    insert into #tm_igr (igr)    
    select pg.igr from apermgr pg where pg.uid=@tmUID and not exists    
                                        (select  1  from #tm_igr t where t.igr=pg.igr)     
   else  begin   
   select @s_kod=@tsKod  
    while  ( 1 = 1 ) begin  
     exec @i=utl_ExtractWord @string=@s_kod output,@delimiter=',',@result=@sKod output                 
      if  @i= 1   break   
     select @tGr=igr from main_gr where s_kod=@sKod  
     insert into #tm_igr (igr)   
     select pg.igr from apermgr pg where pg.uid=@tmUID and igr=@tGr and not exists   
                                        (select  1  from #tm_igr t where t.igr=@tGr)  
   end   
  
  end   
  
 select @tmUID=PUID from ausers where uid=@tmUID   
  
end   
  
  
declare curigr cursor  for  select igr from #tm_igr order by igr  for  read only    
open curigr    
-- перебираем все igr    
  while  ( 1 = 1 ) begin    
   fetch curigr into @tGr    
    if  @@sqlstatus<> 0   break    
    if  (@sKod is  Null ) select @sKod =(select s_kod from main_gr where igr=@tGr)   
             else  select @sKod =@sKod  +','+(select s_kod from main_gr where igr=@tGr)              
  
 end    
close curigr   
deallocate cursor curigr   
select @s_kod=@sKod   
 while ( 1 = 1 ) begin   
 if  (@s_kod is  null ) or (@s_kod='')  break    
  
  select @i=charindex(',',@s_kod)   
   if  @i> 0  begin   
    select @ws_kod=substring(@s_kod, 1 ,@i- 1 )   
    select @s_kod=substring(@s_kod,@i+ 1 , 255 )   
  end   
   else  begin   
    select @ws_kod=@s_kod   
    select @s_kod=''   
  end   
   if  (@ws_kod='') or (@ws_kod is  null )  continue    
  select @what_gr=igr from main_gr (index uk2_main_gr) where s_kod=@ws_kod   
  
  
 if  exists(   
    select * from hist_gr h2 where   
       @what_gr=h2.igr and h2.igr_par=@what_gr   
       and h2.idat_od=(select max(h1.idat_od) from hist_gr h1 where   
                         h2.igr=h1.igr and h2.igr_par=h1.igr_par and h1.idat_od<=@idat_od)   
    and h2.status='+')   
insert into #t1(igr,igr_par,idat_od,lev) values(@what_gr,@what_gr, 0 ,@lev)   
end   
 if  @tsKod='fiktiv'  
begin   
select @what_gr=(select igr from main_gr where s_kod=@tsKod)  
insert into #t(igr,igr_par,idat_od,lev) values(@what_gr,@what_gr, 0 ,@lev)   
end   else  insert into #t(igr,igr_par,idat_od,lev) select igr,igr_par,idat_od,lev from #t1  
  
// Основная работа идет в этом цикле
// Здесь раскручивается каждое подразделние
// а также все его дети до указаного уровня
// подзапрос используется для проверки состояная подразделения на 
// указанную дату. По этому подзапросу выбирается максимално приближенная
// к заданной дате запись и потом по этой записи смотрится состояние Status 
  
 while  ( 1 = 1 ) begin   
   if  (@max_lev> 0 ) and(@max_lev<=@lev)  break     
  ---------------------------   
   delete #g   
  ------------------------   
  insert into #g (igr,igr_par,idat_od,lev)   
   select igr,igr_par,idat_od,lev from #t order by ii,lev,s_kod   
  
  update #t   
    set ii=g.ii from #t t,#g g   
    where t.igr=g.igr and t.lev=g.lev and    
    t.igr_par=g.igr_par and t.idat_od=g.idat_od   
  
 insert into #t (igr,igr_par,idat_od,lev,ii,s_kod)   
   select h.igr,h.igr_par,h.idat_od,@lev+ 1  ,t.ii ,substring(m.name, 1 , 10 )   
   from    
     #t t,   
     hist_gr h(index pk_hist_gr),   
     main_gr m(index pk_main_gr)   
 where   
   h.idat_od=(select max(idat_od) from hist_gr (index pk_hist_gr)   
               where h.igr=igr and h.igr_par=igr_par and idat_od<=@idat_od)   
   and h.status='+'   
  --   
  and h.igr_par=t.igr and t.lev=@lev   
  --   
  and h.igr=m.igr and m.hlev>=@min_hlev   
  --   
  and  exists(   
    select * from hist_gr h2 where   
       h.igr=h2.igr and h2.igr_par=h.igr   
       and h2.idat_od=(select max(idat_od) from hist_gr where   
                         h2.igr=igr and h2.igr_par=igr_par and idat_od<=@idat_od)   
    and h2.status='+')   
  and h.igr<>h.igr_par   
  and is_Nbu is  null     
   if  @@rowcount= 0   break   
   if  @tsKod='fiktiv' and @k= 0   
   if  exists (select  1  from #t t, #t1 t1 where t.igr=t1.igr)  
  begin  
   delete #t from #t t where not exists (select  1  from #t1 t1 where t1.igr=t.igr or t.igr_par=t1.igr)  
   select @k= 1   
  end   
  select @lev=@lev+ 1    
  delete #t where lev=@lev and igr=igr_par   
end   
  
  
 if  @show_all= 0     
select t.lev, case  when t.igr_par=t.igr then  1   else  t.igr_par end as igr_par,m.s_kod,t.igr,--t.idat_od,   
 case  when @with_shift= 0   then m.name  else  replicate(' ',t.lev* 3 )+ m.name end as name,m.is_otd,m.hlev,m.is_filial,   
m.is_tobo    
  from    
    #t t,   
    main_gr m(index pk_main_gr)   
  where t.igr=m.igr  
  --and  case  when t.igr_par=t.igr then  1   else  t.igr_par end=@igr_par  
  
  order by t.ii,t.lev,t.s_kod  

Начальство поставило задачу перевести этот алгоритм в веб-приложение. Чтобы не нагружать сервер.
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34075993
Sit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sit
Гость
Небольшое дополнение.
Данные которые получатся пудут парсится в XML документ servlet-ом. Ссылка на servlet с параметрами (дата, пользователь, уровень, подразделение) будет передаваться в DHTML объект на странице который из xml документа пудет строить дерево подразделений.
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34076248
Sit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sit
Гость
В принцыпе мжно вызывать каждый раз процедуру через JDBC. Но будет ли это быстрее чем на Hibernate? И как SQL сервер справится если пудет много запросов от клиентов?
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34133300
Bad Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SitЕсть веб приложение в котором необходимо реализовать выборку из трех таблиц по запросу пользователя. Таблицы очень большие и поэтому при запросе пользователя каждый раз обращаться к SQL серверу накладно. Таблицы используються только для чтения. Возникла идея загружать все таблицы в приложение и работать с ними в приложении не обращаясь к SQL серверу. Для реализации этого решил использовать Hibernate. Посоветуйте можно ли такое реализовать на нем. Основаная задача разгрузить SQL сервер.
Таблицы большие от 9000 записей и до 30000. Пользователей будет приблизительно до 150 человек. Справится ли Hibernate с таким объемом.
Как алтернатива остается вызов хранимой процедуры на сервере которая пудет вызыватся при каждом обращении пользователя. Как луче сделать - подскажите.
Пуду очень благодарен любым советам и предложениям.
На 30 000 строк он не загнется.
а вот на 3000000 Hiberante уже не подходит.
Но для игрушечных баз он хорош.
...
Рейтинг: 0 / 0
Hibernate+большие таблицы как реализовать
    #34133419
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жесть... афтары пешите еще
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate+большие таблицы как реализовать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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