django - Linux 上 Django 站点上的 unixODBC 问题在刷新时消失

标签 django apache2 mod-wsgi freetds unixodbc

我有一个关于 Django、unixODBC、FreeTDS、Apache2、mod_wsgi 的问题,有点类似于 this question之前在 SO 上问过。

我有一个 Django 网站可以在最新的 Django 上运行,即 1.2.3。它大部分使用托管模型,因为除了 session 信息之外,Django 没有向数据库写入任何内容,只是从中读取。

有问题的数据库托管在 MSSQL 2005 上的 Windows 机器上。

Django 项目托管在 Linux 机器上。它通过 Apache2 上的 mod_wsgi 服务。数据库连接是通过臭名昭著的 FreeTDS 和 unixODBC duo。 FreeTDS 和 unixODBC 的最新版本正在运行。在 Python 端,pyodbc 和 django-pyodbc 用于数据库。

该项目部署在两台 Linux 实时服务器上,具有相同的设置,位于负载均衡器后面。有一个数据库服务器都连接到。

在实时生产服务器上,存在一些间歇性问题。在查询数据库以获取要显示的记录的页面上,有时,我的意思是有时,会抛出异常,并出现错误:

('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')

这个难题的一个奇怪之处在于,每当您遇到此错误时,只需在网络浏览器上点击刷新即可将其清除,并使用从数据库中获取的记录呈现页面。

生成的SQL,从出错时的debug输出来看,很简单:

SELECT COUNT(*) FROM [TABLE] WHERE ([TABLE].[category] = 5 AND [TABLE].[newRelease] = 1 )

在 Django 开发服务器上,这当然不会显示。在开发机器上,mod_wsgi 以守护进程模式运行,我多次遇到这个错误。我通过在 mod_python 上部署进行测试,在那里我没有看到任何错误。然后我在嵌入式模式下使用 mod_wsgi 进行了测试,我也没有看到任何错误。我想更改实时服务器上的设置以在嵌入式模式下使用 mod_wsgi,但有时仍然会出现错误。

我真的被这个困住了。我不确定如何尝试更接近于找出真正导致问题的原因。我不确定我是否提供了所有有用的信息。如果我没有,请指出,我会更新问题。

我不认为代码中有任何错误导致了这种情况。如果是这样的话,它不会在大部分时间或所有时间都有效。我试过在实时服务器上清除 .pyc 文件、重新启动 Apache 等,但无济于事。

任何帮助将不胜感激。

谢谢。

更新:我将“never_cache”装饰器附加到大多数 View 函数,希望 Django 所做的任何小的模型级缓存都可以关闭。但这在实时服务器上并没有真正做任何事情。我现在真的没主意了。

更新 #2:我在 sql_sever/pyodbc/base.py (django-pyodbc) 中围绕生成异常的代码添加了一些日志记录。而且我有更多的 SQL 查询,显然,生成了难以捉摸的错误:

sql = SELECT * FROM (SELECT [TABLE].[id], [TABLE].[productID], [TABLE].[title], [TABLE].[price], [TABLE].[rrp], [TABLE].[saving], [TABLE].[hmvPoints], [TABLE].[availability], [TABLE].[shipping], [TABLE].[rating], [TABLE].[thumbnail], [TABLE].[details], [TABLE].[images], [TABLE].[certImage], [TABLE].[trackListing], [TABLE].[category], [TABLE].[subCategory], [TABLE].[genreId], [TABLE].[bestSeller], [TABLE].[preOrder], [TABLE].[newRelease], (ROW_NUMBER() OVER (ORDER BY [TABLE].[id] ASC)) AS [rn] FROM [TABLE] WHERE [TABLE].[productID] = ? ) AS X WHERE X.rn BETWEEN 1 AND 21

params = (799742,) 

exception = ('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')

sql = SELECT * FROM (SELECT (1) AS [a], (ROW_NUMBER() OVER (ORDER BY RAND() )) AS [rn] FROM [django_session] WHERE [django_session].[session_key] = ? ) AS X WHERE X.rn BETWEEN 1 AND 1

params = ('e4b669b40d10c336d62c8435198bf1db',)

exception = ('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLColAttribute)')

最佳答案

我将尝试自己回答这个问题。我对这个答案不太满意,因为它没有深入解释问题的细节,部分原因是我无法确切地弄清楚问题发生的原因。

通过我能想到的任何方式进行测试,我能够在我的开发环境中重现该问题,并在我需要时重现它。出于某种原因,这可能是由于 FreeTDS 中的错误或我尚未在任何地方的文档中遇到的某种限制,FreeTDS 驱动程序在并发请求时开始抛出上述问题中提到的错误对应用程序进行,然后通过 FreeTDS 访问数据库。即使只有两个用户同时浏览应用程序,FreeTDS 驱动程序也会开始到处抛出错误。

也许有趣的是,在我的测试中,当进行并发 INSERT SQL 调用时,我没有发现它有任何问题。在我的测试进行的范围内,所讨论的问题主要在 SELECT 调用中表现出来。据我所知,这一发现可能只是冰山一角。但众所周知,FreeTDS 不是生产就绪的驱动程序。

我一直在评估 Easysoft 的商业 MSSQL 驱动程序,SQL Server ODBC driver .通过与 FreeTDS 相同的一组测试后,我对这里的内容感到满意。它工作得非常好,当然,这里值得一提的是它支持一系列功能,包括重要的适当 Unicode 支持,而 FreeTDS 不支持。

关于django - Linux 上 Django 站点上的 unixODBC 问题在刷新时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017276/

相关文章:

django - 使用 mod_wsgi 在 Apache2 上部署 Django - Django 项目的正确位置?

python - 新鲜的bash shell-未安装-如何安装命令

python - 要求django url中变量的最小长度

javax.net.ssl.SSLHandshakeException : javax.net.ssl.SSLProtocolException:SSL 握手中止

apache - 无论域如何,如何让 Apache 将/robots.txt 指向一个文件?

python - Django/mod_wsgi 操作系统错误 : [Errno 13] Permission denied: 'static' when DEBUG = OFF

python - Django间接泛型关系

django m2m 模型不同步

ssl - Letsencrypt 在 Windows 上生成的文件 - 什么是什么?

python - 默认 xampp-linux 安装中缺少 config_vars.mk