實(shí)時數(shù)據(jù)庫系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級應(yīng)用的實(shí)時數(shù)據(jù)中樞,通過該系統(tǒng),上層應(yīng)用系統(tǒng)(如 ERP 系統(tǒng)),可以獲得良好的實(shí)時統(tǒng)計(jì)數(shù)據(jù)和實(shí)時統(tǒng)計(jì)信息的支撐。隨著SUPCON實(shí)時數(shù)據(jù)庫在現(xiàn)代企業(yè)信息化建設(shè)當(dāng)中得到了越來越廣泛的應(yīng)用,不但對WINDOWS平臺上主流編程語言提供了良好的支持,而且在ESP-iSYS4.0版本中為Java語言">

      技術(shù)頻道

      ESP-iSYS平臺開發(fā)JAVA實(shí)時應(yīng)用系統(tǒng)

      實(shí)時數(shù)據(jù)庫系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級應(yīng)用的實(shí)時數(shù)據(jù)中樞,通過該系統(tǒng),上層應(yīng)用系統(tǒng)(如 ERP 系統(tǒng)),可以獲得良好的實(shí)時統(tǒng)計(jì)數(shù)據(jù)和實(shí)時統(tǒng)計(jì)信息的支撐。隨著SUPCON實(shí)時數(shù)據(jù)庫在現(xiàn)代企業(yè)信息化建設(shè)當(dāng)中得到了越來越廣泛的應(yīng)用,不但對WINDOWS平臺上主流編程語言提供了良好的支持,而且在ESP-iSYS4.0版本中為Java語言的開發(fā)提供了JRtdbc接口庫,該接口在Jdk1.5平臺上開發(fā),其良好的面向?qū)ο笤O(shè)計(jì)與實(shí)現(xiàn)帶來了每秒訪問磁盤數(shù)據(jù)50000點(diǎn)以上的高性能,最大化的滿足了工業(yè)實(shí)時應(yīng)用性能需求,在符合Java純面向?qū)ο蟮木幊田L(fēng)格的同時,又打破了Java語言低效的束縛,以JRtdbc為橋梁,應(yīng)用Java語言可以方便快速的開出各種優(yōu)秀的實(shí)時應(yīng)用。通過閱讀本文,讀者不僅能用JRtdbc進(jìn)行java實(shí)時應(yīng)用的開發(fā),而且能夠充分體會到JRtdbc提供的簡單快速開發(fā)的優(yōu)越性。
      一 系統(tǒng)結(jié)構(gòu)
      整個JRtdbc的對象層次結(jié)構(gòu):
      系統(tǒng)總體結(jié)構(gòu)圖 -1
      如上UML圖,實(shí)時數(shù)據(jù)庫當(dāng)中的對象體系被明確的映射到了JRtdbc中,隱藏了實(shí)時數(shù)據(jù)庫的一些艱澀的概念,其中IConnectionPool為連接池,類似于jdbc的數(shù)據(jù)庫連接池,也是用JRtdbc進(jìn)行開發(fā)時第一個要獲得的對象,可以通過其獲取實(shí)時數(shù)據(jù)庫連接IConnection,實(shí)時數(shù)據(jù)庫連接聚合了系統(tǒng)的四個核心工廠
      名稱
      功能
      ITagFactory
      獲取位號/位號組實(shí)例。
      IUserFactory
      添加刪除枚舉用戶/用戶組。
      ITypeFactory
      添加刪除枚舉對象類型。
      IRegion getRegionRoot()
      獲取對象樹根節(jié)點(diǎn),遍歷實(shí)時數(shù)據(jù)庫對象樹
      ,通過工廠方法,可以得到實(shí)時數(shù)據(jù)庫的四大功能模塊,位號與位號組;用戶與用戶組;對象類型與權(quán)限體系;整個實(shí)時數(shù)據(jù)庫對象樹的訪問與操作;設(shè)計(jì)一致而且清晰,讓開發(fā)人員更容易理解與使用,下面逐一進(jìn)行介紹并講解使用方法。
      二 使用方法
      Ø 實(shí)時數(shù)據(jù)庫連接的建立
      JRtdbc提供了連接池工廠PoolFactory,包含二個工廠方法:
      IConnectionPool getPool() ; Œ
      IConnectionPool getPool(int poolLength,int timeout) ; 
      其中工廠方法Œ用于構(gòu)建默認(rèn)參數(shù)配置的連接池實(shí)例,工廠方法允許用戶自定義連接池配置,參數(shù)poolLength定義為連接池連接上限,如果池中未達(dá)到上限,有新連接請求,直接新建連接放入池中返回,如已達(dá)上限,則償試重登錄其他用戶空閑連接,無空閑連接存在則進(jìn)入阻塞狀態(tài)直到有連接釋放,從而保證了系統(tǒng)不會無限制地增加并發(fā)連接并且可以充分利用空閑連接。參數(shù)timeout定義為連接池中的連接空閑達(dá)到一個給定的毫秒數(shù)后就自動釋放連接,從而進(jìn)一步節(jié)省實(shí)時數(shù)據(jù)庫連接資源。IConnectionPool 連接池接口,通過getConnection(String conStr)方法獲取一個與實(shí)時數(shù)據(jù)庫之間的連接IConnection。JRtdbc連接池經(jīng)過專門設(shè)計(jì),用戶只須獲得連接,像普通對象一樣調(diào)用,無須考慮底層連接狀態(tài),完全由連接池托管,擺脫了像Jdbc那種獲得連接后還要時時不忘c(diǎn)lose()的那種煩惱,降低了使用復(fù)雜度。如何獲取實(shí)時數(shù)據(jù)庫連接?
      //首先獲得連接池實(shí)例,能過連接字符串得到連接IConnection實(shí)例
      IConnectionPool pool = PoolFactory.getPool();
      IConnection conn = pool.getConnection( String conStr ) ;
      連接字符串格式:
      host:192.168.0.171:5051;user=xxxxxx;password=xxxxxx;
      其中各字段具體含義如下:
      字段
      含義
      host
      為實(shí)時數(shù)據(jù)庫所在計(jì)算機(jī)的IP和端口,其中,前xxx.xxx.xxx.xxx指一個4段式IP地址,“:”后為實(shí)時數(shù)據(jù)庫的端口地址
      user
      用戶名,有效內(nèi)容為大小寫英文字母、下劃線
      password
      密碼,有效內(nèi)容為大小寫英文字母、數(shù)字、下劃線、連字符
      如果建立連接成功,則返回一個有效的IConnection對象實(shí)例,如果在連接建立過程中存在異常情況,則拋出IOException類型的異常。
      Ø 位號與位號組
      位號是存儲在實(shí)時數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)點(diǎn),對應(yīng)底層控制系統(tǒng)的數(shù)據(jù)源,通過JRtdbc曝露給用戶的只是一個簡單的ITag對象,調(diào)用其方法即可對位號/位號組進(jìn)行操作,工業(yè)現(xiàn)場的控制設(shè)備,在提供數(shù)值的同時,也提供了對數(shù)值質(zhì)量的判斷,所以,實(shí)時數(shù)據(jù)庫中的數(shù)據(jù)是有質(zhì)量碼的,通過質(zhì)量碼,可以確定讀回的值是否可信、可用。在通常的應(yīng)用中,驗(yàn)證質(zhì)量碼是缺省的,當(dāng)出現(xiàn)錯誤質(zhì)量碼的時候,位號讀取方法會拋出BadValueException異常,除了質(zhì)量碼跟數(shù)值,位號值還包括了采集數(shù)據(jù)值的時間戳,因此把數(shù)值,質(zhì)量碼,時間戳封裝進(jìn)了一個TagValue,作為一個位號值。位號組則是以一組位號為單位的TagGroup實(shí)例,聯(lián)合讀取各位號的實(shí)時值或歷史值,以二維表的形式返回,以位號組中各位號名為列,支持以列名或者列索引獲取組內(nèi)某位號的每行數(shù)據(jù)。通過位號工廠即可獲取位號與位號組對象,ITagFactory提供如下工廠方法:
      名稱
      功能
      getTag(String name)
      獲取位號實(shí)例。
      getTagGroup(String[] names)
      獲取位號組實(shí)例。
      getTagGroup(String regex)
      獲取位號組實(shí)例。
      (一) 讀位號實(shí)時值
      通過位號工廠ITagFactory的getTag(tagNameStr)方法來獲得實(shí)際的位號實(shí)例。該方法將根據(jù)位號的具體屬性,返回虛位號或?qū)嵨惶柕膶?shí)體,而JRtdbc使用者并不需要關(guān)系其細(xì)節(jié)。具體的方法如下:
      ITag t = conn.getTagFactory().getTag( tagName ) ;
      通過ITag實(shí)例,可以完成讀取實(shí)時值的操作。雖然每個位號均有其原生的數(shù)據(jù)類型,但ESP-iSYS在讀取時做了安全的類型轉(zhuǎn)換,也就是說,對于一個int類型的位號,仍然可以采用readFloat或readString方法,來獲得浮點(diǎn)值或字符串值。ITag接口提供了針對不同數(shù)據(jù)類型的方法,如下:
      方法
      功能
      readBoolean
      讀取boolean類型的值
      readDouble
      讀取double類型的值
      readFloat
      讀取float類型的值
      readInt
      讀取int類型的值
      readLong
      讀取long類型的值
      readShort
      讀取short類型的值
      readString
      讀取String類型的值
      這些方法均會返回實(shí)時數(shù)據(jù)庫中位號的最新值,通過TagValue位號值封裝類的getTimeStamp方法,可以獲取到該位號值對應(yīng)的時間戳。典型的使用代碼如下:
      ITag t = conn.getTagFactory().getTag( tagName ) ;
      TagValue v = t.readValue() ;
      Date timeStamp = v.getTimeStamp() ;
      SimpleDateFormat sft = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss " );
      String timeString = sft.format( timeStamp);
      如果兩種數(shù)據(jù)類型間不能正確轉(zhuǎn)換時,readXXXX方法將會拋出TypeCastFailedException異常。
      (二) 寫位號實(shí)時值
      寫實(shí)時值的方法和讀取實(shí)時值是對應(yīng)的,寫位號同樣可以采用不同的類型寫入,其列表如下:
      方法
      功能
      writeBoolean
      寫boolean類型的值
      writeDouble
      寫double類型的值
      writeFloat
      寫float類型的值
      writeInt
      寫int類型的值
      writeLong
      寫long類型的值
      writeShort
      寫short類型的值
      writeString
      寫String類型的值
      JRtdbc會自動為該寫操作分配時間戳和打上正確的質(zhì)量碼。
      (三) 讀位號歷史數(shù)據(jù)
      通過ITag實(shí)例,可以完成讀取實(shí)時數(shù)據(jù)庫內(nèi)存與磁盤歷史數(shù)據(jù) ITag接口提供了如下方法:
      方法
      功能
      readAllMemHisValue()
      讀取全部內(nèi)存歷史值
      readMemHisPointValue(Date p)
      讀取某時刻磁盤歷史值
      readMemHisValue(Date b,Date e)
      讀取某個時間段的內(nèi)存歷史值
      readMemHisValue(Date b,Date e,long i)
      采樣讀取某個時間段的內(nèi)存歷史值
      readDiskHisPointValue(Date p)
      讀取某時刻磁盤歷史值
      readDiskHisValue(Date b,Date e)
      讀取某個時間段的磁盤歷史值
      readDiskHisValue(Date b,Date e,long i)
      采樣讀取某個時間段的磁盤歷史值
      readHisValue(Date b,Date e,long i)
      自動區(qū)分內(nèi)存或磁盤歷史
      采樣,即為以一定的時間間隔去讀位號值,如果某時刻無值存在,以NULL填充,因此采樣讀歷史數(shù)據(jù),讀出來的是一個以相等時間間隔的值序列。不采樣純粹讀出時間條件范圍內(nèi)的所有位號值,典型的讀位號歷史值的代碼如下:
      ITag t = tf.getTag(“TT3502”) ;
      //讀取全部內(nèi)存歷史
      ArrayList<TagValue> vs = t.readAllMemHisValue() ;
      //讀取時間段的磁盤歷史,begin,end 起始與結(jié)束時間,inter采樣間隔,無值時以NULL填充進(jìn)容器。
      ArrayList<TagValue> vs = t.readDiskHisValue( begin,end,inter)

      (四) 讀取位號組值
      讀位號組的接口方法與單個位號是一樣的,統(tǒng)一接口,易于使用,首先以一組位號名為參數(shù),通過位號工廠得到位號組對象,調(diào)用讀取方法,與單個位號不同的只是位號組返回的是以位號名為列的二維表TagDataTable形式的結(jié)構(gòu),與Jdbc的Record類似,可以遍歷表中的所有行,通過位號名或者列索引獲得組內(nèi)某個位號的值,因此Java開發(fā)人員可以像處理Jdbc的Record一樣處理位號組返回的數(shù)據(jù),典型的使用代碼如下:
      String[] names = {“TT3501”,”TT3502”,”TT3503”}
      ITagFactory tf = conn.getTagFactory() ;
      ITagGroup tgrp = tf.getTagGroup(names) ;
      //讀實(shí)時值
      TagDataRow r = tgrp.readValue() ;
      TagValue v = r.getValue(“TT3501”) ;
      //讀歷史值
      TagDataTable t = tgrp.readDiskHisValue(begin,end,interval);
      For(TagDataRow row : t.getRows()){
      TagValue v = row.getValue(0);//以索引獲得
      System.out.println( v.getTimeStamp() ) ;//打印獲取時間。
      }
      通過JRtdbc操作實(shí)時數(shù)據(jù)庫位號與位號組是如此的方便與直觀,用戶完全感覺不到正在操作的是深奧的實(shí)時數(shù)據(jù)庫。
      &Oslash; 用戶與用戶組
      登錄實(shí)時數(shù)據(jù)庫的用戶,以一個用戶對象IUser存儲在實(shí)時數(shù)據(jù)內(nèi)部,當(dāng)然還有其隸屬的用戶組IUserGroup,用戶也可以在權(quán)限范圍內(nèi)增加刪除用戶,為用戶分配權(quán)限,分配用戶組,所有操作類似于平常操作系統(tǒng)的用戶用戶組結(jié)構(gòu),從系統(tǒng)UML圖可以看出,IUser與IUserGroup派生于IUserBase,IUserBase抽取出了公共的對權(quán)限訪問列表操作的方法。通過IConnection獲得IUserFacotry用戶工廠,該工廠提供了如下工廠方法:
      方法
      功能
      addUser(UserAttribute attr)
      添加用戶
      addUserGroup(UserGroupAttribute attr)
      添加用戶組
      delUser( String name )
      刪除用戶
      delUserGroup(String name)
      刪除用戶組
      getUsers()
      枚舉用戶
      getUserGroups()
      枚舉用戶組
      (一) 添加刪除枚舉用戶/用戶組
      添加用戶/用戶組一般操作相當(dāng)簡單,取得連接后,得到用戶工廠,建立用戶或用戶組屬性對象,調(diào)用工廠方法addUser與addUserGroup即可,刪除用戶/用戶組只須以名稱為參數(shù)調(diào)用delUser/delUserGroup方法,典型代碼如下:
      IUserFacotry uf = conn.getUserFacotry() ;
      //添加用戶
      IUser u = uf.addUser( new UserAttribute(“TESTUSER”)) ;
      Boolean b = uf.delUser(“TESTUSER”) ; //刪除用戶
      //添加用戶組
      IUserGroup grp = uf.addUserGroup( new UserGroup(“admin”)) ;
      Boolean b = uf.delUserGroup(“admin”);//刪除用戶組
      //枚舉用戶用戶組
      ArrayList<IUser> users = uf.getUsers() ;
      ArrayList<IUserGroup> grps = uf.getGroups() ;
      (二) 驗(yàn)證用戶權(quán)限
      實(shí)時數(shù)據(jù)庫有完整的安全機(jī)制,每個對象類型都有一系列的權(quán)限項(xiàng)存在,只有在權(quán)限允許的情況下,用戶才能對實(shí)時數(shù)據(jù)庫中的對象進(jìn)行操作,IUser接口提供了簡單的接口來驗(yàn)證用戶是否具有操作實(shí)時數(shù)據(jù)庫對象的權(quán)限,比如用戶是否有權(quán)刪除一個位號,刪除位號這個權(quán)限項(xiàng)被定義在位號對象類型內(nèi),典型代碼如下:
      IUser u = new User(conn,”admin”) ;
      String path = “.\水化車間\TT3502”;//某車間下的一個位號
      String right = “刪除位號” ;
      Boolean b = u. authenticate(path,right) ;
      If( b ) { ……} else { System.out.println(“用戶無權(quán)限刪除該位號”);}
      (三) 用戶/用戶組權(quán)限訪問列表
      用戶/用戶組擁有一個允許訪問列表和一個拒絕訪問列表,這二個列表描述的是在對象類型當(dāng)中定義的權(quán)限項(xiàng)是否具有,JRtdbc使用者可以通過IUser與IUserGroup提供的接口獲得訪問列表ArrayList<ACEHeader>,ACEHeader類封裝了對象路徑與之對應(yīng)的權(quán)限名稱,并支持增加或刪除列表項(xiàng),下面以IUser為例,給出典型代碼:
      IUser u = new User(conn,”admin”) ;
      String path = “.\水化車間\TT3502”;//某車間下的一個位號
      String right = “刪除位號” ;
      Boolean b = u. removeACE(path,right) ;//刪除了用戶對位號的刪除權(quán)限
      IUser u2 = new User(conn,”test”) ;
      Boolean b = u2.addACE(path,right) ;//用戶具有了刪除權(quán)限
      //枚舉
      ArrayList<ACEHeader> aces = u.getACList() ;
      ArrayList<ACEHeader> dcls = u.getDCList() ;
      &Oslash; 對象類型與權(quán)限體系
      實(shí)時數(shù)據(jù)據(jù)庫當(dāng)中的對象都有其對應(yīng)的對象類型,例如,位號就是一個對象樹上的特殊類型。對象類型都派生于IElementType,該接口提供了如添加自定義屬性描述、添加權(quán)限項(xiàng)等功能。類型工廠ITypeFactory提供了下列工廠方法:
      名稱
      功能
      addType(ElementTypeAttribute attr)
      添加對象類型
      delType(String typename)
      刪除對象類型
      getTypes()
      枚舉對象類型
      獲取連接,得到類型工廠后,即可添加刪除對象類型,
      (一) 添加刪除對象類型
      在實(shí)時數(shù)據(jù)中添加對象類型非常的簡單,比如在實(shí)時數(shù)據(jù)庫當(dāng)中添加一種報(bào)表這樣的一種類型,可先獲得類型工廠,然后建立新類型的屬性對象TypeAttribute其中只有類型名必須指定,調(diào)用addType添加,刪除類型只須調(diào)用delType,并以對象類型名稱為參數(shù),典型代碼如下:
      ITypeFactory typef = conn.getTypeFacotry() ;
      TypeAttribute attr = new TypeAttribute(“報(bào)表”) ;
      IElementType type = Typef.addType( attr ) ;//添加對象類型。
      Boolean b = typef.delType(“報(bào)表”) ;//刪除對象類型
      ArrayList<IElementType> types = typef.getTypes() ;//枚舉
      (二) 添加自定義屬性描述
      在實(shí)時數(shù)據(jù)庫當(dāng)中,可以為實(shí)時數(shù)據(jù)庫對象添加自定義屬性,存儲在對象屬性ElementAttribute的Hashtable中,實(shí)時數(shù)據(jù)庫為驗(yàn)證自定義添加的屬性正確性,用戶必須提供自定義屬性的描述信息,為簡化操作,JRtdbc把描述信息抽象成TypeBase,具體描述類派生于此基類,提供了自定義屬性的相關(guān)約束條,如最大值,最小值,值類型等,目前支持三種自定義類型的添加,Int32Type整型,DoubleType浮點(diǎn)型和StringType字符串型。比如現(xiàn)有report1這么一個報(bào)表對象,用戶要為其添加一個名為path的路徑屬性,值為C:\report,則首先應(yīng)該獲取報(bào)表對象類型對象,在類型對象當(dāng)中添加這個自定義屬性的描述信息,如自定義屬性名應(yīng)該為path,類型為String,最大長度為100等信息,這樣才能正確的為具體報(bào)表對象添加進(jìn)這個自定義屬性,典型代碼如下:
      StringType t = new StringType( path,true,”c:\report”) ;
      t.setMaxLength(100);
      Boolean b = type.addAttribute( t ) ;
      (三) 添加權(quán)限項(xiàng)
      實(shí)時數(shù)據(jù)庫中每種對象類型都有其權(quán)限項(xiàng)列表,比如報(bào)表這個對象類型,它有完全控制、讀報(bào)表,寫報(bào)表、添加報(bào)表、刪除報(bào)表等權(quán)限項(xiàng),用戶可以通過接口對權(quán)限項(xiàng)進(jìn)行添加或刪除,首先新建一個權(quán)限屬性對象,設(shè)置權(quán)限項(xiàng)名稱等信息,獲得對象類型對象,調(diào)用addRight添加即可,刪除操作直接以權(quán)限名為參數(shù),調(diào)用delRight即可,典型代碼如下:
      RightAttribute attr = new RightAttribute(“報(bào)表完全控制”) ;
      Boolean b = type.addRight( attr ) ;//添加權(quán)限項(xiàng)
      Boolean b = type.delRight( rightName ) ;//刪除權(quán)限項(xiàng)
      &Oslash; 對象樹的訪問與操作
      為簡化在ESP-iSYS上進(jìn)行Java開發(fā),ESP-iSYS內(nèi)部以企業(yè)資源樹的形式來組織對象,位號、報(bào)表、區(qū)域、流程圖等都是樹上的對象,其中區(qū)域里面可以有對象也可以包含子區(qū)域,就像企業(yè)里面的組織結(jié)構(gòu),比如一個部門里有許多對象,也有許多車間,車間里又有位號之類的對象可能還有二級車間,這里部門和車間或二級車間在實(shí)時數(shù)據(jù)庫里就表示為區(qū)域?qū)ο?。對象樹上的所有對象都派生于IElement,使得開發(fā)人員可以統(tǒng)一對待所有對象,對象屬性有預(yù)定義屬性和自定義屬性,預(yù)定義屬性以成員變量的形式存于對象實(shí)例中,自定義屬性存放于Hashtable中,須先以TypeBase在對象類型中添加自定義屬性描述后,才能為對象正確添加自定義屬性,目前支持浮點(diǎn)型、整型、字符串型三種類型,如圖:
      可以通過IConnection方法getRegionRoot()獲取對象樹的根區(qū)域節(jié)點(diǎn)IRegion,從而完全遍歷與訪問各類對象。
      (一) 添加對象
      連接建立后,可通過IConnection的getRegionRoot方法獲得對象樹根結(jié)點(diǎn),遍歷到欲添加對象的區(qū)域節(jié)點(diǎn),然后以對象屬性ElementAttribute為參數(shù),對象屬性封裝類已提供了大部份默認(rèn)值,用戶可只對必要字段進(jìn)行賦值即可構(gòu)建屬性對象,避免了對大串屬性一一賦值的煩瑣,簡化開發(fā),再調(diào)用addElement(ElementAttribute attr)方法添加對象,相同方法添加位號或其它對象,典型代碼如下:
      IRegion root = conn.getRegionRoot() ;
      RealTagAttribute realTagAttr = new RealTagAttribute(“TT”);
      ITag t = root.addTag( realTagAttr ) ;添加位號
      //IElement e = root.addElement(ElementAttribute attr) ;
      (二) 添加自定義屬性
      遍歷對象樹獲取對象實(shí)例,調(diào)用getElementAttribute方法獲取對象屬性,調(diào)用addCustAttrbute(name,value)添加自定義屬性,如在對象類型屬性內(nèi)未添加自定義屬性描述,或者與描述信息不符,則拋出InValidAtrributeException,典型代碼如下:
      ITagFactory tf = conn.getTagFactory() ;
      ITag t = tf.getTag( “TT3502” ) ;
      ElementAttribute ta = t.getElementAttribute() ;
      Ta.addCustAttr(“CustAttr”,”CustAttrValue”) ;
      &Oslash; 異常處理模塊
      JRtdbc有一套完整的異常體系,所有JRtdbc自有的異常全部派生于RtdbcException,含義明確,對拋出原因一目了然,并且大部份定義為未檢異常,因?yàn)檫@些異常拋出后,用戶無力恢復(fù),未檢異常不用讓用戶必須Try,Catch,這樣減少代碼量,降低開發(fā)復(fù)雜度。具體如下:
      名稱
      含義
      RtdbException
      實(shí)時數(shù)據(jù)庫異?;?/DIV>
      BadValueException
      位號值質(zhì)量碼異常,讀到壞值時拋出
      InValidPackageException
      包解析錯誤時拋出
      InValidAttributeException
      添加自定義屬性時,屬性無效時拋出
      三 實(shí)例展示
      下面是一個使用JRtdbc開發(fā)的一個讀取位號實(shí)時值與歷史值的完整示例,緊湊簡短的幾句Java代碼即可讀取到工業(yè)自動化領(lǐng)域當(dāng)中的實(shí)時信息。
      四 總結(jié)
      以上詳細(xì)介紹了ESP-iSYS平臺Java接口的架構(gòu)與使用步驟,“一個連接,四個工廠”通過短短的數(shù)行Java代碼即能揭開實(shí)時數(shù)據(jù)庫的神秘面紗,讓開發(fā)人員暢游整個實(shí)時數(shù)據(jù)庫,Java愛好者們可以盡情享受用Java快速開發(fā)實(shí)時應(yīng)用所帶來的樂趣。浙江中控軟件技術(shù)有限公司在今后會不斷的對其進(jìn)行維護(hù)和升級,并對開發(fā)者提供良好的技術(shù)支持,共同努力在J2EE平臺上開發(fā)出更多更優(yōu)秀的實(shí)時應(yīng)用。

      文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

      主站蜘蛛池模板: 亚洲日韩激情无码一区| 国模无码一区二区三区不卡| 亚洲国产视频一区| 制服丝袜一区在线| 久久精品无码一区二区三区免费| 波多野结衣一区视频在线| 在线视频一区二区三区四区| 一区二区三区四区无限乱码 | 99精品国产高清一区二区| 中文字幕一区在线观看| 国产一区二区三区美女| 中文字幕国产一区| 精品女同一区二区三区免费站| 欧美日韩一区二区成人午夜电影 | 人妻无码一区二区视频| 国产精品一区二区久久国产| 国产伦精品一区二区三区女| 男人免费视频一区二区在线观看| 久久精品免费一区二区三区| 国产精品视频一区国模私拍 | 精品国产一区二区三区免费看| 国产午夜精品一区二区| 午夜影院一区二区| 国产免费一区二区视频| 在线观看一区二区三区视频| 久久久无码精品国产一区| 精品国产区一区二区三区在线观看| 国产一区二区不卡在线播放| 无码人妻一区二区三区免费 | 亚洲丰满熟女一区二区v| 一区五十路在线中出| 亚洲电影唐人社一区二区| 亚洲AV无码一区二三区| 久久精品国产一区二区三| 日本精品一区二区三本中文| 一区高清大胆人体| 无码人妻少妇色欲AV一区二区| 亚洲乱色熟女一区二区三区蜜臀| 中文字幕av无码一区二区三区电影| 国产日产久久高清欧美一区| 午夜DV内射一区二区|