各个业务系统,都须要查询各种数据库;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