1.libmyodbcԴ??
libmyodbcԴ??
在使用log4cxx日志框架将日志内容输出至MySQL数据库过程中,遇到了无法找到驱动的问题。首先,确保运行环境为Ubuntu . bit和Eclipse CDT,idea源码是什么以及log4cxx版本为apache-log4cxx-0..0。通过添加配置选项`./configure --with-ODBC=unixODBC`完成编译,随后配置unixODBC驱动和数据源。使用命令`isql log4cxx`能够成功建立连接,然而在使用log4cxx进行日志输出时,却始终收到错误提示“log4cxx: Failed to connect to database. - [unixODBC][Driver Manager]Data source name not found, and no default driver specified”。
针对问题,9人牛牛源码首先检查Eclipse环境变量设置,添加了`ODBCSYSINI`、`ODBCINSTINI`和`ODBCINI`变量,但问题仍然存在。怀疑配置文件可能存在问题,内核源码和aosp但没有找到官方推荐的配置方法。配置文件包括`/etc/odbcinst.ini`和`/etc/odbc.ini`,分别设置了数据库描述、驱动、数据源等信息。springmvc源码和原理接着,查看`log4cxx.xml`配置文件,检查ODBC连接参数。
深入分析log4cxx源码,发现用于数据库记录的api自绘源码日志Appender采用的是`ODBCAppender`,在`src/main/cpp/odbcappender.cpp`中,原始代码使用了`SQLxxxW()`进行数据库连接和操作,这是为了使用Unicode编码方式。尽管在`odbcinst.ini`中配置的驱动`libmyodbc5w.so`确实支持Unicode方式,问题在于代码仍然采用了宽字节操作方式。修改为`SQLxxx()`调用形式,并将`SQLWCHAR`替换为`SQLCHAR`,成功解决了找不到数据源的问题。然而,这样做引入了中文显示的问题。
在排查过程中,发现加入预处理器定义`#define SQL_WCHART_CONVERT`,可以解决编译时的问题。进一步分析源码,确认作者在特定条件下选择使用Unicode编码方式是合理的。至此,问题解决,但中文显示问题仍需进一步处理。