3

Django、unixODBC、FreeTDS、Apache2、mod_wsgi について質問があります。これは、以前に SO で尋ねられたこの質問と似ています。

最新の Django、つまり 1.2.3 で実行するように構築された Django Web サイトがあります。ほとんどの場合、管理されたモデルを使用します。セッション情報を除いて、Django によって DB には何も書き込まれず、DB から読み取られるだけです。

問題の DB は、MSSQL 2005 の Windows マシンでホストされています。

Django プロジェクトは Linux マシンでホストされています。これは、Apache2 の mod_wsgi を介して提供されます。DB 接続は、悪名高い FreeTDS と unixODBC のデュオを介して行われます。FreeTDS と unixODBC の両方の最新バージョンが実行されています。Python 側では、pyodbc と django-pyodbc が DB に使用されます。

プロジェクトは、ロード バランサーの背後にある同一の設定で、2 つの Linux ライブ サーバーにデプロイされます。両方が接続する 1 つの DB サーバーがあります。

稼働中の本番サーバーでは、断続的な問題がいくつか発生します。表示するレコードを取得するために DB にクエリを実行するページでは、次のエラーとともに例外がスローされることがあります。

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

この難問の奇妙な点の 1 つは、このエラーが発生するたびに、Web ブラウザーで更新を押すだけでエラーがクリアされ、DB からフェッチされたレコードでページがレンダリングされることです。

エラーが発生したときにデバッグ出力から生成される SQL は非常に単純です。

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」デコレータをほとんどのビュー関数に追加しました。おそらく、Django が行う小さなモデルレベルのキャッシングをオフにできることを期待しています。しかし、それはライブサーバーでは実際には何もしませんでした. 私は今、本当にアイデアがありません。

更新 #2sql_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)')
4

1 に答える 1

2

私は自分自身で質問に答えようとします。問題の詳細を説明していないため、この回答にはあまり満足していません。これは、問題が発生する理由を正確に把握できなかったためです。

思いついた方法でテストを行った結果、開発環境で問題を再現し、必要なときにいつでも再現することができました。何らかの理由で、FreeTDS のバグか、どこかのドキュメントでまだ遭遇していない何らかの制限が原因である可能性がありますが、FreeTDS ドライバーは、同時要求が発生したときに上記の質問に記載されているエラーをスローし始めます。アプリケーションに作成され、次に FreeTDS を介してデータベースにアクセスします。2 人のユーザーが同時にアプリケーションをブラウズしている場合でも、FreeTDS ドライバーはあらゆる場所でエラーをスローし始めます。

おそらく興味深いのは、私のテストでは、同時INSERT SQL 呼び出しが行われたときに問題が発生しなかったことです。問題の問題は、私のテストの範囲内で、主にSELECT呼び出しで大声で現れます。私が知っている限りでは、この発見は氷山の一角にすぎないかもしれません。しかし、FreeTDS が本番対応のドライバーではないことはよく知られています。

Easysoft の商用 MSSQL ドライバー、SQL Server ODBC ドライバーを評価してきました。FreeTDS で行ったのと同じ一連のテストを行った結果、ここにあるものに満足しています。それは非常にうまく機能し、もちろん、FreeTDS がサポートしていない重要な適切な Unicode サポートを含む多数の機能をサポートしていることをここで言及する価値があります。

于 2010-11-06T13:22:56.647 に答える