当mod_dbd不支持我的驱动程序时,我该如何在Apache中持久化DB Conn

How should I go about DB Conn persisting in Apache when mod_dbd doesnt support my driver?

本文关键字:Apache Conn DB 持久化 dbd mod 不支持 我的 驱动程序      更新时间:2023-10-16

我正在使用ODBTP接口从Linux Apache 2到SQL Server。x主机。mod_dbm不支持这个,我需要能够将代码移动到任何支持Apache的主机。

关于我的环境的说明:我使用Apache 2.2.17, c++包装在C中for Apache, ODBTP 1.14, SQL Server 2008。

我已经成功地实现了ODBTP连接,我能够充分使用模块本身内的数据,但是我想要保持连接,而不是连续连接,断开连接,并重新开始为我的应用程序使用本地HTTP调用以JSON格式检索数据。

问题是,我需要在一个环境中部署这个应用程序和模块,在这个环境中,我不相信纯文本编写的应用程序的安全性,以安全地保护数据库凭据。当应用程序通过HTTP连接时,它只提供我的模块在发送到数据库之前解密的加密凭据。

我目前正在为数据库创建一个句柄,并将其存储在模块定义中的关键apr_hash_t表中。应用程序连接后,模块查找应用程序在URL中指定的每个请求的惟一令牌,以查找该应用程序的连接。

哈希键是32位的键,最初是从池中创建的一个char *,并与ODBTP句柄一起作为哈希表中的一行存储。不知怎么的,调用之间的键被修改了,原来的键现在是一个截断的版本。

的例子:1)我从我的应用程序中发出1个调用来启动持久连接。这个作品。2)我从我的应用程序进行3个背靠背调用来执行sql字符串。(/明星/execute_sql/独特/& lt;>/sql/& lt;>) x 3

第一个调用是完美的,我检索数据。下一次调用保存为键的令牌将被截断,并且模块无法找到关联的键。下一次调用令牌将处于与第2次尝试相同的截断状态。

我不确定我是否在覆盖内存?我编写了一个简短的循环函数来输出哈希表的内容,这样我就可以在代码中的每个点上插入这个函数,以找出数据可能已经损坏的地方,但是我的发现没有任何意义。为了找到嵌入在uri中的数据,我必须拆分uri。在这个函数中,我跟踪了内存移动到一行"raw = apr_psprintf(apache->pool,"%s",subject);",如下面的代码所示。

void theRequest::get_exploded_str(char *subject, char *delimiter)
{
    // variables
    char *raw, *next, *last;
    // create the split chars database if not created
    loadSDB();
    apr_array_clear(x_split_chars);
    subject = apr_pstrndup(apache->pool, subject, string(subject).length());
    raw = apr_psprintf(apache->pool,"%s", subject);
    next = (char*)apr_strtok(raw, delimiter, &last);
    while (next)
    {
        // add next to array
        *(char **) apr_array_push(x_split_chars) = apr_pstrdup(apache->pool, next);
        // fetch next
        next = (char*)apr_strtok(NULL, delimiter, &last);
    }
    return;
};

它在调用1时工作得很好,但在调用2时就不一样了,因为键被移动了。

任何想法?或者甚至一些关于如何使用APR_RESLIST来更好地完成此任务的想法?

提前感谢!

我发现我不能直接通过应用程序池,而是通过ODBTP库本身。由于它是一个TCP到ODBC的桥接,所以它能够在一定程度上汇集连接,但效率不够高。

由于服务器环境的变化,我放弃了这个任务,转而使用SQLite3作为应用程序数据库。