各個業務系統,都須要查詢各種數據庫;html
通常查詢數據庫都是客戶端本身鏈接,根據如今的狀況,存在如下幾點問題java
1.客戶端鏈接不少,鏈接大小,峯值不可控c++
2.客戶端SQL程序員本身寫,良莠不齊git
3.SQL書寫方式不一樣。程序員
將數據庫查詢抽成服務端能夠解決的問題github
1.只有數據傳遞的網絡通訊redis
2.數據庫查詢由服務端性能決定sql
3.能夠隔離數據庫操做,由服務端設置查詢峯值數據庫
4.統一檢查數據庫查詢的相關問題,便於調試json
5.在必要的狀況下,剝離SQL語句在服務端,由專門的程序員寫SQL,優化SQL,客戶端只傳入請求的條件。
DBCacehServer服務提供的功能
1.數據庫查詢,java實現跨越任意部署,支持多SQL數據庫;
2.不支持的數據庫能夠本身擴展,將數據庫客戶端驅動JDBC包放入drivers目錄,服務端啓動會動態加載。
3.服務端不大。
4.客戶端請求簡單,支持服務端配置SQL,以及客戶端本身寫SQL語句傳輸。
5.支持單SQL語句或者參數化SQL語句
6.服務端鏈接池,使用了網絡吹噓的HikariCP數據庫鏈接池,使用配置簡單
7.序列化。軟件主要支持json格式序列化及二進制序列化
8.動態建立model,按照服務端配置或客戶端提供的ID,客戶端若是須要返回結果是datafomat,則是返回bean(model),那麼
服務端會動態建立類,從無到有。
9.超時執行。分3類:1.客戶端提供超時時間;2.服務端默認超時時間;3.一直等待。這樣即便數據庫有問題,也不會影響數據庫使用,客戶端返回。至於採用哪種,也是客戶端設置決定。客戶端設置超時時間爲0,則採用服務端默認設置,超時-1則一直等待,大於0則是客戶端設置的超時。
DBCacehServer服務擴展功能,須要知足如下條件及配置
1.中英文轉換表
讓服務端初始化查詢對應關係
2.須要用戶資料表,有userid,username
3.能夠提供多值字典項,例如你的業務中有多個單位信息,你要創建的關係是dw(ename)-003(zid)-xx中學(zname)這樣的關係,ename是與中英文轉換關聯,zid單位編碼(有多個單位),對應的單位名稱(zname);
你須要提供這樣的一個SQL查詢,明確字段,讓服務端初始化查詢。
4.提供一張數據權限表:明確用戶,數據庫表名,數據庫表的操做:
服務端將數據庫表操做分紅幾類:數據增刪改查,建立表,刪除表,truncate;相似如圖:
userid | tablename | insert | delete | update | select | create | drop | truncate |
1 | Test | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE |
配置SQL語句及字段,服務端初始化加載,則造成數據表的操做權限,創建起數據權限
有了以上幾點的提供,服務端就創建了完整的一套功能。
(1)中英文轉換,標題轉換,值轉換,二者都轉換,都不轉換4類,由客戶端設置,有對應設置字段,枚舉型
(2)查詢時轉換字典值,相似上面舉例單位
(3)用戶權限,解決數據控制問題。服務端會分析SQL,判斷SQL裏面對錶的各類操做,查看有沒有權限
另外其實還有個隱藏功能,可是我沒有提供,它須要數據庫表的良好設計及編碼格式的解決,可是沒法作到統一提供。
當解決了編碼問題(客戶端編碼,服務端編碼,數據庫編碼)。則在客戶端查詢時,能夠寫成 用戶名稱='jason' ,而後在服務端接收到後,轉變成username='jason',因此要解決編碼問題。這樣可以很方便的解決UI查詢問題,不用轉換。並且能夠作到模板化及自動化,UI映射就會很方便,可是因爲有編碼問題,因此服務端如今沒法統一提供該功能。
(4)查詢數據緩存。服務端提供了SQL查詢的緩存,對於非參數化的查詢,服務端對數據緩存,可以提供給多客戶端查詢提供方便。對於有專門查詢的UI是很是好的。可是有個小問題,對於不一樣業務系統,你要考慮緩存時間及數據的查詢及時性,還有就是你服務端內存大小,對於緩存,後面我還會多多說兩句。
這樣,服務端提供了強大的4大功能,可以爲客戶端查詢簡化不少問題。同時利用服務器的性能,充分解決查詢問題。服務器就應該有服務器的用法。
其它說明:
1.該軟件及版本,我並無提供集羣及負載均衡,這個功能通常是我寫服務端的基本功能,可是這裏我沒有提供,你能夠用一些框架實現。也許從此會升級版本添加,可是我感受該軟件沒有必要。
一個簡單部署方法,你作一個DNS服務器,將其作成域名,而後多臺機器部署,讓DNS去解析便可。
2.緩存。本軟件只實現了具體SQL緩存數據,該緩存有時間設置及緩存大小問題。因此須要本身根據業務設置。另外,參數化參數沒有緩存,這個能夠設置一個映射關係,將其轉換成一個固話key來緩存,我尚未設計,能夠自行設計,用於緩存。緩存已經被封裝爲一個單例,很方便修改。能夠修改代碼,在緩存查詢那裏擴展查詢,利用redis等緩存擴展,若是你須要充分的緩存數據。
3.數據權限檢查。我實現了該功能,可是由於我需求小,因此沒有足夠SQL測試,更加沒有測試全部的數據庫。因此算是提供了模板,若是沒有寫全,你只須要測試添加就行,完善一下統計功能,也很簡單。不過你要理解開源組件jsqlparser,也很簡單,我就在網上遇到問題搜,幾小時解決。
4.功能權限。這裏我沒有提供,其實也能夠放在這裏,很簡單,客戶端須要提供一個ID,設計時以功能路徑的方式,來檢查該用戶有沒有該模塊便可,而後返回一個結果。或者初始化時,客戶端調用一個檢查SQL.讓服務端加載。好比前一種:學生查詢/學生分數查詢/學生數學分數查詢。這樣就有權限了。可是我不須要,因此沒有提供該功能。
5.動態建立類model.該功能須要配置好JDK.因爲建立方式選擇在內存,因此你看不見java文件以及class文件,jdk直接在內存中建立了一個類。當前若是你要以bean(model)返回,客戶端必須有相似的類。後期版本升級客戶端,會監測客戶端有沒有model,若是沒有就在返回結果時,把服務端的類信息一塊兒返回客戶端,而後在客戶端動態加載該類,這樣就減小了客戶端建立該類,你只要定義一個名稱就能夠了。建議使用時你採用HashMap來使用。固然,這就須要你配置好JDK,讓客戶端可以動態加載類。
6.軟件提供了幾類設置
1.客戶端設置結果的序列化方式:json格式仍是二進制方式。
若是是二進制方式,隱藏了查詢數據時返回model(bean),服務端會動態建立類。而後序列化返回
2.查詢數據轉換。查詢的數據按照數據表及數據內容,能夠進行中英文及字典轉換。一個枚舉類型,包括:標題轉換,值內容轉換,都轉換以及都不轉換。
若是是二進制轉換,則不會再MODEL中轉換,可是會返回對應的中英文轉換關係hashmap,以及字典值hashmap<string,hashmap<string,string> .可是數據中有的,被篩選了,不是全集。返回客戶端後須要本身轉換去取。由於建立類
我不習慣用中文作字段名稱,還有編碼問題。
須要的組件包:
jsqlparser,fastjson,msgpack,dom4j,guava,HikariCP,netty,slf4j,log4j,log4j-slf4j-impl以及各類數據庫數據庫客戶端JDBC驅動包。
可見,都是公共開源的包,性能也是承認的。總共部署大約10多M.我會持續研究升級。同時保障全部包是開源的。
最後的話 :
軟件雖然小,可是解決了不少問題,簡化了不少開發。功能基本知足。
若是感興趣的,能夠下載使用,完善我沒有提供的功能及權限驗證功能。可以解決編碼問題就解決了不少問題。
若是有興趣完善,也但願可以提交到git.供你們一塊兒使用,而且完善數據庫查詢方案。
當前是java版本的。若是客戶端是c#,c++.你要實現客戶端,很簡單,就是1個類及2個枚舉。而後本身弄個TCP通訊,序列化傳輸便可。使用本身的序列化組件,jason格式的以及對應版本的msgpack。固然動態加載類就不能夠了,你須要本身在客戶端建好model的類。簡不簡單。
已經持續升級,升級內容見git項目說明。擴展redis支持
源碼:
https://github.com/jinyuttt/DBCacheServer.git