由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用access库作为db。开始还好,但是后来发现access数据库有一问题,就是表空间会随着使用越来越大,哪怕表里没有数据。因为表中单次存放的内容是很小的,每隔几分钟会全删除然后再
由于单位业务需要,搭建一台服务器专门用来做数据存储。因为数据流很小,遂采用access库作为db。开始还好,但是后来发现access数据库有一问题,就是表空间会随着使用越来越大,哪怕表里没有数据。因为表中单次存放的内容是很小的,每隔几分钟会全删除然后再写入,所以表也会越来越大啊!
开始是用vb写的一个压缩软件,因为是m$自家的语言嘛,自然对office系列支持很好,后来发现ruby中也可以通过win32ole访问jet引擎,为何不用ruby来写呢?因为是以前写的代码神马都用class来搞,稍显夸大,但效果还好。
#hb table write by hopy 2012 require 'win32ole'require 'oci8'class hb def initialize @oci = oci8.new(xxx,***,xxx) end def open unless @acs conn_str = provider=microsoft.jet.oledb.4.0;data source=#{dir.pwd}/hb.mdb #conn_str = driver={sql server};database=xxx;server=localhost,1433;uid=sa;pwd=sa @acs = win32ole.new('adodb.connection') @acs.open(conn_str) end end def close (@acs.close;@acs=nil) if @acs end def cls self.open sql = delete * from intable;@acs.execute(sql) sql = delete * from outtable;@acs.execute(sql) end def zip start = time.now self.close jet = win32ole.new('jro.jetengine') path = dir.pwd+/hb.mdb new_path=dir.pwd+/hb_ziped.mdb file.delete(new_path) if file.exist?(new_path) sp = provider=microsoft.jet.oledb.4.0 ss = sp+;data source=+path sd = sp+;data source=+new_path jet.compactdatabase(ss,sd) file.delete(path) file.rename(new_path,path) puts access ziped , take #{time.now - start} s end def sync self.cls self.open zb = [64981,57520] i = 0;start = time.now ret = @oci.exec('select * from dbo.dpxs_arrival') do |r| next if r[7].unpack(v*) != zb zt = if r[24] == arrived r[23] elsif r[25] r[25] else r[23] end tm = if r[12] r[12] elsif r[11] r[11] else r[10] end @acs.execute(insert into intable values('#{r[0]}','#{tm}','#{r[13]}','#{zt}'));i+=1 end puts sync #{i} arrival flights , take #{time.now - start} s i = 0;start = time.now ret = @oci.exec('select * from dbo.dpxs_departure') do |r| next if r[7].unpack(v*) != zb tm = if r[13] r[13] elsif r[12] r[12] else r[11] end @acs.execute(insert into outtable values('#{r[0]}','#{tm}','#{r[14]}','#{r[27]}'));i+=1 end puts sync #{i} departure flights , take #{time.now - start} s endendinterval_sec = 10hb = hb.newt = 0loop do sleep(interval_sec);t+=interval_sec hb.sync (hb.zip;t=0) if t >= 60 #t=0 if t >= 60end