功能库解耦

背景:由于某个客户提出的定制需求,在模块中引入了OCI动态库,通过对库接口函数进行简单封装做成静态库,供模块调用以实现写oracle数据库。

问题:模块程序启动依赖于该静态库和OCI动态库,不事先导入这些库文件程序根本启不来。OCI库文件比较大,导入比较费时和麻烦,而绝大部分客户并不需要该功能。因此,需要将该定制功能做下解耦处理,使得程序启动和原有的基础功能不依赖于OCI库,定制功能不受影响。

思路一:将通过OCI库接口写oracle数据库功能做成独立的应用程序,原模块程序通过命令行参数调用该独立程序实现写数据库。这个方法改动量比较大,且在参数传递时可能会因为特殊符号问题遇到麻烦,常见的处理办法有两个,一是参数做base64编解码,另一个是加单引号,如原参数是A'B,那么真正传的参数是'A'\''B'。

思路二:通过OEM解决。将定制需求相关代码用条件编译宏隔离出来,准备两份Makefile,标准的Makefile不变,含定制功能的Makefile中通过-D参数定义条件编译宏。这个方法改动量很小,但会给后续Makefile的维护带来麻烦,因为Makefile的修改必须保证两份是同步的。

思路三:将接口封装成动态库,通过动态加载的方式调用接口函数。具体做法是封装OCI库时编译成.so库,调用处改成用dlopen/dlsym/dlclose函数动态加载。这种方法改动量也较小,且一劳永逸。

posted @ 2015-06-29 15:43  boyfaceone  阅读(386)  评论(0编辑  收藏  举报