2012-02-22 16 views
20

なぜ私はクラス変数@@をレールで使用しないでください。そこにはセキュリティの抜け穴がありますか?私がレールで新しいものとして答えてください。インスタンス変数@variable_nameを使用しています。私は一度試しました@@variable_nameレールでクラス変数@@を使用しないでください。

私はクラス変数についてのみ知っている、クラス変数がオブジェクト

の間で共有可能ですしかし、私は本当に私たちは、レール内のクラス変数を@@使用しないでくださいなぜを知りたいのですが?

+0

Javaでは 'static'変数のように聞こえます。それを使用しない理由はありません。インスタンスに属しておらず、非同期に変更される可能性があることに注意してください。 – Chloe

答えて

41

スレッドセーフではないためです。多くのレール=可能なサーバーはマルチスレッドです。つまり、ある時点でアプリケーションの実行インスタンスが複数存在する可能性があり、ユーザーのいずれかの要求は、そのいずれかに任意に割り当てられます。クラス変数はプロセス間で共有されないため、後続の要求でクラス変数が異なる可能性があります。

あなたが意図的に1つのスレッドサーバーでアプリケーションを実行することを管理したとしても、あなたのクラス変数を失って、あなたのアプリケーションが要求の間に再起動されないという保証はありません。

クラス変数と同様の機能を使用するには、MemcachedやRedisなどのKey-Valueストアを調べることを強くお勧めします。

+0

@@ varsだけでなく、プロセス間で何も共有されません。同じ理由で@varsを使うべきではないと思いますか? –

+7

@Victorさて、 '@ variables'はインスタンス変数であり、**要求内で**一貫しています**リクエストがコントローラの新しいインスタンスを生成するためです。ただ次のリクエストでそれらを見つけることを期待しないでください。 – edgerunner

+0

downvoterは理由を説明する気になりますか? – edgerunner

関連する問題