unixODBC使用经验分享

unixODBC使用 命令安装 root@greatwall-DF720:/usr/local/php/etc# sudo apt-get install unixodbc unixodbc-bin unixodbc-dev 安装完后,odbcinst –j 来查看安装位置等信息 说是啥可以看到安装位置信息,可是没看到啊 。 我用时secureFx看的文件,结果各个文件都翻遍了,都没找到。浪费了好多时间,结果使劲刷新Fx,,最后终于看到了 etc下面的odbcinst.ini 和odbc.in... 阅读详情

unixODBC(http://www.unixodbc.org)和iODBC(http://www.iodbc.org)是UNIX系统上两个开源的ODBC实现。关于二者的比较,有兴趣的朋友可以参考stackoverflow上的这篇帖子。我没有用过iODBC,所以不好评论孰优孰劣。但是从stackoverflow上关于两个项目的标签统计来看,应该是unixODBC用的更广泛一些。在距离上一版本发布两年以后,今年10月,unixODBC发布了2.3.2版本,基本上就是修正了一些bugs(其中有3个bug是我发现并提出修改意见的,偷笑),没有新的feature引入。我从2011年开始在项目中使用unixODBC,2012年中旬项目正式上线,到现在已经运行了1年半时间。总的来说unixODBC还是很稳定的,基本连个错误都没有。在这篇文章中,我把我使用unixODBC的一点经验分享出来,希望能给需要的朋友一些帮助。


(1)源码,编译和安装

在unixODBC的网站上提供了最新版本的源码下载,如果想下载之前的发布版本,可以访问这个网站:ftp://ftp.unixodbc.org/pub/unixODBC/。个人感觉,unixODBC的代码风格还是很清晰的,前后也比较一致(unixODBC里面也包含了一些其它开源的代码,像libltdl,而这些开源代码的风格和unixODBC的风格是不一致的)。只是有些函数有些太长了(像SQLConnect函数就有600多行),似乎不符合KISS(Keep It Small and Simple)原则。

编译unixODBC很简单:

./configure;

make;

make install

我的很多同事都说在Solaris环境下编译源代码是很痛苦的事情,但是编译unixODBC却总是一气呵成,连个错误都没有。

此外,由于默认编译unixODBC是优化的,所以我在实验室里使用时一般都是禁止优化的(./configure CFLAGS='-g -O0 '),这样debug时也比较方便,不会出现代码和函数对不上的问题。只有到了生产环境,才把优化打开。


(2)使用连接池

从2.0.0版本起,uinixODBC引入了连接池。unixODBC的项目负责人Nick Gorham在这篇文章里详细介绍了连接池。引入连接池,可以使对数据库连接的使用更高效。下面我就对连接池的原理做个分析:

首先,uinixODBC引入两个全局变量:

/*
 * connection pooling stuff
 */

CPOOL *pool_head = NULL;
int pooling_enabled = 0;
其中pool_head指向连接池链表的首节点,而pooling_enabled则表示是否使用连接池。

其次,在SQLDisconnect函数中,可以看到:

/*
 * is it a pooled connection, or can it go back 
 */

if ( connection -> pooled_connection )
{
    __clean_stmt_from_dbc( connection );
    __clean_desc_from_dbc( connection );

    return_to_pool( connection );

    ......

    return function_return( SQL_HANDLE_DBC, connection, SQL_SUCCESS );
}
else if ( pooling_enabled && connection -> pooling_timeout > 0 ) 
{
    __clean_stmt_from_dbc( connection );
    __clean_desc_from_dbc( connection );

    return_to_pool( connection );

    ......

    return function_return( SQL_HANDLE_DBC, connection, SQL_SUCCESS );
}

如果使用了连接池的话,当断开连接时,连接是回到了连接池里,也就是return_to_pool这个函数。

最后,在SQLConnect函数中,可以看到:

if ( pooling_enabled && search_for_pool( connection, 
                                            server_name, name_length1,
                                            user_name, name_length2,
                                            authentication, name_length3,
                                            NULL, 0 ))
{
    ret_from_connect = SQL_SUCCESS;

    .....

    connection -> state = STATE_C4;

    return function_return( SQL_HANDLE_DBC, connection, ret_from_connect );
}

如果连接数据库时可以在连接池中找到可用的连接(search_for_pool),函数就直接返回,不用再做连接的操作了。


(3)在日志中打印线程

unixODBC的日志输出是通过dm_log_write函数:

if ( !log_info.program_name )
{
    uo_fprintf( fp, "[ODBC][%s]%s[%s][%d]%s\n", __get_pid((SQLCHAR*) tmp ), 
			tstamp_str,
            function_name, line, message );
}
else
{
    uo_fprintf( fp, "[%s][%s]%s[%s][%d]%s\n", log_info.program_name,
        __get_pid((SQLCHAR*) tmp ), 
		tstamp_str,
		function_name, line, message );
}

可以看到,日志输出包含进程名,时间戳,函数名,行号,和消息。但是现在的程序基本是多线程的,所以当有多个线程同时访问数据库时,从日志就很难区分开哪个线程到底做了什么,因此通常我会在日志中增加对线程的打印。因为我们的程序运行在Solaris系统,而在Solaris上,pthread_t类型是个整数,标示当前的线程号,所以下面的改动就可以增加对线程号的输出:

if ( !log_info.program_name )
{
    uo_fprintf( fp, "[ODBC][%s][%d]%s[%s][%d]%s\n", __get_pid((SQLCHAR*) tmp ), pthread_self(),
			tstamp_str,
            function_name, line, message );
}
else
{
    uo_fprintf( fp, "[%s][%s][%d]%s[%s][%d]%s\n", log_info.program_name,
        __get_pid((SQLCHAR*) tmp ), 
		pthread_self(),
		tstamp_str,
		function_name, line, message );
}

由于pthread_t类型在不同的系统定义不一样,所以如果同一份unixODBC代码需要运行在不同系统上,就需要实现定制化:

#ifdef __linux__
......
#endif

#ifdef __sun
......
#endif
关于pthread_t的打印,可以参考stackoverflow上的 这篇帖子 。

以上就是我使用unixODBC的一点经验分享,希望能给需要的朋友一点帮助。如果大家有其它好的经验,也希望能分享出来。

unixODBC的安装与使用(包含如何解决乱码问题) 最近在一个项目中有需要数据库直接另一数据库的需求,折腾了两天,通过unixODBC解决了,写一下总结,与大家分享一下。 阅读详情

相关推荐

unixODBC编程(一)安装配置ODBC

unixODBC安装配置,其中出现的问题及解决方法

tomcoding的博客 1901

Linux UnixODBC安装配置

资源紧张的时候,服务器是大家共用的,上面部署了一堆服务。因为最终,我们是使用 golang 进行开发的。原来是我在疯狂的改环境的时候,无意间造成了破坏。路径为:/home/dmdba/dmdbms/bin/可以成功连接DB,并能执行测试语句,说明 UnixODBC 配置成功。这里路径和之前不一致是因为,为了保证可行性,先在Linux上做了适配。说明:像镜像仓库中提交该镜像,以后用的时候,直接拉取即可。必须得是达梦的,不能是UnixODBC自己生成的。幸好是在 Docker 里,没有对他人造成影响。

LuckyTHP 2817

基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战解析

本文详细解析了基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战方案。从环境搭建、驱动安装、双雷达配置、外参标定、时间同步到点云融合核心实现,全面介绍了技术要点与避坑指南,并提供了工程化部署与性能优化建议,助力开发者高效实现高精度点云合成应用。

ss78901的博客 1093

Linux中安装unixODBC,配置oracle数据源与驱动

由上述结果可知:驱动文件在/etc/odbcinst.ini;配置个人的DSN在/home/oracle/.odbc.ini。注意需要在root用户下添加LD_LIBRARY_PATH环境变量和ORACLE_HOME环境变量。[root@rac1 ~]# source .bash_profile #令上述环境变量生效。SERVER = 192.168.**.** #oracle的ip地址。driver = Oracle in Racdb11g_home #驱动名称。

2301_78312656的博客 3347

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3889

基于立创·庐山派K230的红色激光点识别和锁定追踪

本文介绍了一种基于立创・庐山派K230开发板的红色激光点识别与追踪系统。该系统通过摄像头采集图像,采用RGB565格式和Gamma校正进行预处理,利用颜色阈值筛选实现红色激光点检测。核心追踪算法采用状态机设计,包含未锁定和已锁定两种状态,通过计算欧氏距离判断目标连续性,并具有丢失计数机制确保稳定性。系统通过UART接口以自定义二进制协议输出坐标数据,同时提供可视化反馈。该方案在800×480分辨率下实现了实时、稳定的单目标追踪,具有检测精度高、响应速度快的特点,适用于工业定位和机器人导航等嵌入式视觉应用场景

m0_73738367的博客 1652

DTL使用中遇到的sql.h无法找到的解决过程

最近任务,看DTL,高级货呢么,一搜,还有OTL,哎,看到一个linux培训机构的广告,培训Linux下开发,包括ACE,Boost,OTL,DTL....看到个评论,说这几个就够喝一壶的了,哎,算来估计的确是啊,虽然最近也看点ACE,不过目前是让DTL,储备力量,爆发之。。。

coder_xia的专栏 4748

操作系统笔记【全-408统考】【附思维导图】

操作系统 思维导图 概述 操作系统的概念 管理计算机软件和硬件资源 最基本的系统软件 特征 并发 区分并发并行 共享 互斥共享方式 同时访问方式 虚拟 逻辑上多个。虚拟处理器的分时,空分复用的虚拟存储器 采用多道程序设计 异步 由于资源有限,进程走走停停 可能会导致进程产生与时间有关的错误。访问顺序 目的和功能 1.管理计算机资源 功能 处理机管理、存储器管理、文件管理、设备管理 目标:安全、有效 2.作为用户与计算机硬件系统

wvdon 2363

Linux 下用 Python 连接 MSSql Server 2008

Linux 下用 Python 连接 MSSql Server 2008

qq_44925249的博客 746

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

magic-api的鉴权机制配置 (附实战代码)

引入magic-api及相关数据库驱动依赖 配置yml文件和编辑器JS文件 实现登录鉴权逻辑,包括用户验证和Token处理 接口鉴权拦截器设计,确保接口访问安全性 文章提供了完整的代码示例,帮助开发者快速集成magic-api框架并实现权限控制功能。

码农研究僧的博客 227

mac ox php.ini 位置,在Mac OSX上启用PHP pdo_odbc扩展

我试图在运行PHP 5.3的Mac上启用PHP的pdo_odbc扩展.以下是我尝试使其工作的方法:>我用brew安装了UnixODBC$brew install unixodbc>下载PHP 5.3.8的源代码.在终端我导航到pdo_odbc文件夹.然后做了以下.$phpize$./configure --with-pdo-odbc=unixODBC$make有一个错误./Users/...

weixin_35756373的博客 311

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

ubuntu php odbc驱动,unixODBC安装(mysqlUbuntu)

这几天真是郁闷死了,基本每天都在编译安装QT和unixODBC,无奈总会出现些莫名其妙的错误。首先,我承认我Linux玩地不熟,但这些开源软件产商之间的兼容性也太差了吧。所以还是制定个标准比较好,大家都遵守一个约定。从这个意义来说,微软的垄断,还是有一定这几天真是郁闷死了,基本每天都在编译安装QT和unixODBC,无奈总会出现些莫名其妙的错误。首先,我承认我Linux玩地不熟,但这些开源软件产商...

weixin_29668721的博客 569

【人工智能】向量数据库全生命周期数据安全防护体系:破解向量化与检索双环节泄露风险

大模型时代,向量数据库已成为RAG(检索增强生成)架构、语义检索、多模态应用的核心基础设施,解决了大模型幻觉、长上下文窗口限制、私有知识落地等核心痛点。但行业普遍存在认知误区:将Embedding向量等同于“无害的语义压缩乱码”,忽视了向量数据原生的泄露风险。

奶爸的编程之路,也就一周冷个三天 154

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c通过 unixodbc 连接_【参赛作品23】PHP unixODBC Apache openGauss实现数据库的连接

说明:本文为openGauss技术文章征集作品参赛之一。环境:openEuler20.03 LTS数据库:openGauss1.0.1PHP:5.6.30unixODBC:2.3.0Apache:2.4.31.安装unixODBC具体请参考官方文档基于ODBC开发注意,这里请将unixODBC的lib文件权限修改为755,否则可能无法在浏览器上通过PHP访问openGauss。特别是“p...

weixin_28749363的博客 610

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

centos libmyodbc mysql,无法使用unixodbc,libmyodbc连接到远程mysql服务器

我在这方面有点绿,我希望我遇到的问题很简单……编辑:底部的新信息我需要连接到远程mysql(Amazon RDS)数据库.在完成一些教程之后,我在客户端上安装并配置了unixodbc和libmyodbc,但是当我尝试通过isql连接时,我收到错误[08S01][unixODBC][MySQL][ODBC 5.1 Driver]Can't connect to local MySQL server ...

weixin_33509600的博客 383

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【大数据开发运维解决方案】超级详细的VMware16安装Redhat8&挂载镜像配置本地yum源&安装unixODBC教程

这是一篇非常详细的介绍如何通过VMware安装redhat8操作系统的文章,并且介绍了如何配置网络让大家在windows机器通过xshell访问安装后的操作系统。 以此为前提,给大家介绍了在没有yum源的内网环境中如何通过挂载系统镜像来制作yum源并介绍如何编译安装unixODBC。

赵延东的一亩三分地 11万+

基于夸平台libodbc++(unixodbc)开发实例

libodbc ++内部结构调用ODBC标准的API封装,在此本人特以libodbc ++学习共享下个人写的调用实例。 本人亲自测试过下面代码在窗下和Linux的下运行,当然在windows和linux下代码编译都大大小小遇到过很多问题,由于过于麻烦就不一一叙述了。 需要注意如下:  libodbc ++中的语句:: execute(sql)执行插入,更新,删

华琳科技的专栏 1400

QT连接达梦数据库DM8,我踩过的那些坑:银河麒麟V10下UnixODBC编译与环境变量配置全记录

本文详细记录了在银河麒麟V10系统下使用QT连接达梦数据库DM8的完整流程,重点解析了UnixODBC编译、环境变量配置及常见错误解决方案。通过实战经验分享,帮助开发者避开国产化替代过程中的典型陷阱,实现高效稳定的数据库连接。

dinongxu8804的博客 489

【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

引言 ...

openGauss的博客 285

达梦数据库如何连接MySQL_【干货分享】如何使用ODBC的方式连接DM7数据库

2.1安装unixODBC如果想在unix/linux下使用ODBC,则需要使用unixODBC组件,对应的安装包可以在其官网上下到.在aix平台编译unixodbc需要设置环境变量,如下:exportCC=gccexportCFLAGS='-maix64-DBUILD_REAL_64_BIT_MODE'exportOBJECT_MODE=64./configure--enable-...

weixin_42216454的博客 394

卸载unixodbc_Linux下删除卸载系统自带的MySQL数据库

近期由于工作需要,加上偶上辈子修来的福分,让偶一个坐coder的,去linux下配置运行环境。故,经历了些事,且总结了点东东,今晚有机会写下点东东,与各位分享一下.../*****---------------- Uninstall Linux installed mysql begin -------------------*****/由于redhat Enterprise 5 中自带一个m...

weixin_30558657的博客 588

Ubuntu 下配置OTL 链接MySQL

网络上这方面的资料不是很全面

gufeijunchi的专栏 1894
上一篇: “北漂”小记
下一篇: 如何理解CPU利用率
一个手艺人
博客等级 码龄16年 20粉丝 67原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值