問題タブ [stateless-session]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - NHibernateStatelessSessionを使用したカスケードコレクション
HasMany
ステートレスセッションを使用して、他のエンティティのコレクション(マッピング)を含むエンティティを一括挿入する適切な方法は何ですか?
たとえば、親クラスは次のようにマップされます。
ステートレスセッションはカスケードオプションを無視するため、子ノードは自動的に永続化されません。コレクションを自分で繰り返すことはParent_id
できましたが、書き込み可能なプロパティとして列が存在しないため、リレーションを設定できません。
私は何かが足りないのですか?
web-services - セッションなしのHTTPリクエスト署名
私は彼に送信されるすべてのリクエストに対して次のことを保証するRESTWebサービスを考えています:
- リクエストは、それを主張するユーザーによって生成されました;
- リクエストは他の誰かによって変更されていません(uri / method / content / date);
- GETリクエストの場合、署名を確認して有効期限を設定するのに十分な情報を含むURIを生成できる必要があります。このようにして、ユーザーは、生成されたURIを使用して、リソース上の限られた期間、一時的なREAD権限を共同編集者に委任できます。
クライアントは、パスワードに基づいてIDとコンテンツ署名で認証されます。
セッションはまったく存在しないはずなので、サーバーの状態です。サーバーとクライアントは秘密鍵(パスワード)を共有します
それについて考え、本当に素晴らしい人々と話をした後、私のユースケースのように単純なことを行うためのRESTサービスは存在しないようです。(HTTPダイジェストとOAuthはサーバーの状態でこれを行うことができ、非常におしゃべりです)
それで私は1つを想像しました、そして私はそれがどのように設計されるべきかについてあなたの偉大なコメントを求めています(私はそれをOpenSourceにリリースし、それが他の人を助けることができることを願っています)。
このサービスは、カスタムの「Content-signature」ヘッダーを使用して資格情報を保存します。認証されたリクエストには、次のヘッダーが含まれている必要があります。
リクエストは、作成されてから10分後に無効になります。
たとえば、一般的なHTTPリクエストは次のようになります。
サーバーは答えます:
また
変数は次のようになります:
URIパラメータ
いくつかのパラメーターをURIに追加できます(それらはヘッダー情報をオーバーロードします):
- _sras.content-signature = <METHOD>-<USERID>-<SIGNATURE>:HTTPヘッダーではなく、URIにクレデンシャルを配置します。これにより、ユーザーは署名されたリクエストを共有できます。
- _sras.date = Sun、06 Nov 1994 08:49:37 GMT(リクエスト日*):リクエストが作成された日付。
- _sras.expires = Sun、06 Nov 1994 08:49:37 GMT(有効期限*):サーバーにリクエストが指定された日付より前に期限切れにならないように指示します
*日付形式:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
コメントしてくれてありがとう。
nhibernate - NHibernate を使用して一括挿入できない
アプリケーションに一括挿入を追加しようとしましたが、Batcher はまだ BatchSize が 1 の NonBatchingBatcher です。
これは、C#3、NH3RC1、MySql 5.1 を使用しています。
これをSessionFactoryに追加しました
そして、私のコードはこのようになります
問題のインスタンスには HILO ID 生成を使用していますが、データベース上のすべてのインスタンスには使用していません。SessionFactory.OpenStatelessSession は型をとらないため、この型でバッチ処理を実行できるかどうかを実際に認識できませんか、それとも...?
NHibernate を掘り下げた後、SettingsFactory.CreateBatcherFactory で追加情報を提供する可能性のあるものを見つけました。
構成が間違っている可能性はありますか?
c# - ステートレスセッションを使用したディクショナリ値のレイジールックアップ
私のアプリでは、特定のユーザーについて、そのユーザーに属するオブジェクトの各インスタンスの「設定」を取得できるように、3項辞書マッピングを設定しました。つまり、私は次のようなものを持っています:
したがって、Baz
オブジェクトがあるときはいつでも、を介して現在のユーザーのbaz設定を検索できますcurrentUser.BazSettings[baz]
。
ステートレスセッションを使用してこれを実行できるようにしたいのですが、次のLazyInitializationException
コードでを取得します。
代わりにを使用するISession
と、問題は解決します。
完全なNHibernateエラーメッセージには、「セッションまたはセッションが閉じられていません」というテキストが含まれています。ステートレスセッションを使用する場合、エンティティはセッションに接続されないため、これは理にかなっています。ただし、ステートレスセッションを使用してこのルックアップを実行する方法があると思います。
ステートレスセッションを使用してルックアップを実行するにはどうすればよいcurrentUser.BazSettings[baz]
ですか?
authentication - インプットを求めています: サーバー状態なしでサーバーセッションを維持します
私はセキュリティの専門家ではないので、私が考案した認証スキームに大きな穴を開けてくれる人を探しています。または、同じ目標を満たすより優れた既存のスキームを教えてくれる人を探しています。
問題の概要
クライアントがセッションのライフサイクルを維持するインターフェイスがあります (これは Web サーバー上の HTTP セッションですが、実際には問題ではありません)。
ステートレス サーバーは、呼び出し元の認証を必要とするいくつかのサービスを提供します (サーバーにはこの認証を実行する機能があります)。
ただし、サーバーが各呼び出しで呼び出し元を認証する必要がないことが望ましいです。たとえば、各呼び出しで資格情報を渡すことによってです。(認証プロセスにはコストがかかる場合があります。)
サーバー上でセッション状態を維持しないことも望ましいです。1 つには、クライアントとサーバーの両方で独立したセッション タイムアウト (クライアントのセッション タイムアウトを取り除くことはできません) を持つ脆弱なソリューションを求めているだけであり、信頼できるセッション ライフタイムを維持するにはサーバー タイムアウトが必要なようです。サーバー上で (適切な時間に明示的にセッションを終了するためにクライアントに依存するのではなく)。別の理由として、サーバーはこの種の状態を保存するように設定されていません。
サーバーには明示的なauthenticate
メソッドがあります。問題は、別のメソッドが呼び出されたときに、サーバーにセッション状態を保存せずに、呼び出し元がそのメソッドを使用して以前に認証されたことをサーバーがどのように確認するかということです。authenticate
提案された解決策
これが私が思いついたスキームです:
このauthenticate
メソッドは、資格情報を入力パラメーターとして受け入れます。認証が成功すると、サーバーは次の 2 つを返します。
- 認証が実行された時刻を示すタイムスタンプ。
- 秘密鍵で暗号化された、{ユーザー名、タイムスタンプ}のタプルの暗号化バージョン
その後のメソッド呼び出しでは、クライアントはこれらの値の両方をサーバーに返します。次に、サーバーは暗号化された { ユーザー名、タイムスタンプ } タプルを復号化します。復号化されたタイムスタンプがクライアントから送信された暗号化されていない値と一致する場合、サーバーはクライアントが以前に認証されたことを認識します (有効な暗号化された値を取得する唯一の方法であるため)。復号化されたユーザー名は、どのユーザーが認証されたかをサーバーに伝えます。
暗号化されたキーの有効期間は、現在の時刻からx時間以内のタイムスタンプのみを許可することで適用できます。これはセッション タイムアウトと同じではありませんが、侵害されたタイムスタンプが悪意のある人物によって使用される可能性があるウィンドウを制限します。
そう
このスキームは多くの点でナイーブなのではないかと心配しています。どのような弱点や悪い論理が見られますか?
.net - NHibernate を介したステートレス セッションを使用したひ孫コレクションのイーガー フェッチ
NHibernate Stateless Session を使用して、大量のデータをデータベースにロードしています。データが読み込まれると、後のエンティティは子コレクションに追加するために前のエンティティを検索する必要があります。この操作には、孫オブジェクトのデータが必要であり、ひ孫のコレクションが利用可能である必要があります。
基準は次のようになります。
これを実行すると、セッションの永続化コンテキスト エンティティ エントリが空であるためTwoPhaseLoad
、例外がスローされます。InitializeEntity
ローダーが検索しているエンティティは Child エンティティです。ここで永続化コンテキスト エントリ マップが空なのはなぜですか? オブジェクトは明らかにフェッチされ (正しい SQL が生成され、正しい結果が返されます)、「子」エンティティが正しく作成されます。エンティティの構築状態が正しくないのはなぜですか? ステートレス セッションが熱心な読み込み中に一時的な永続化コンテキストを使用する方法と関係がありますか?
multithreading - ステートレス セッション スレッドは安全ですか?
ISession がスレッドセーフでないことはわかっています。IStatelssSession もスレッドセーフではありませんか? 答えはノーだと思います。簡単に検索しましたが、これに関するリファレンスは見つかりませんでした。
ありがとう。
nhibernate - NHibernate StatelessSessionを使用する場合、エンティティを更新し、子プロキシを無視します
StatelessSessionを使用してエンティティを一括更新しようとしています。
ステートレスであるため、NHibernateは保存時に子エンティティを自動カスケードしません。
子エンティティに変更を加えたくないので、これは問題ありません。
残念ながら、保存すると、NHibernateは次のように不平を言います。
"オブジェクトは保存されていない一時インスタンスを参照します-フラッシュする前に一時インスタンスを保存します。タイプ:MyAssembly.MyRandomEntity、エンティティ:Castle.Proxies.MyRandomEntityProxy"
もちろん、子エンティティを更新しようとすると、次のエラーが発生します。
「次の永続機能はありません:Castle.Proxies.MyRandomEntityProxy」
ご覧のとおり、子エンティティはロードされていないため、プロキシです。必要ない、更新したくない…でも、更新してもどうしたらいいのかわからない。
基本的に一時的な子エンティティを無視するように指示して、この問題を解決する方法はありますか?
アップデート
親オブジェクトの子エンティティのマッピングは次のとおりです。
子エンティティのId列は次のとおりです。
nhibernate - Nibernate ステートレス セッションを使用して子の ForeignKey を更新する
ステートレス セッションを使用している間は、オブジェクトの関連付け (子) を明示的に保存する必要があることを理解しています
次のオブジェクトがある場合:
親のインスタンスを変更してそれに子を 1 つ追加し、次のステートメントを使用して親と子を保存します。
これを行うと、親が正常に更新され、子レコードが作成されますが、子テーブルのフィールド Parent_Id は null のままであるため、関連付けは記録されません。
ステートレス セッションを使用してアソシエーションを手動で記録するにはどうすればよいですか?
nhibernate - nhibernate statelesssessionを介してコレクションを保存します
クラス内で多対多のコレクションがマッピングされた 2 つのクラスがあります。
これは、私の2つのクラスの単純化されたマッピングです。
車両:
ゾーン:
私のプログラムには、システムのストレス テスト用に 9600 のゾーンと 5000 の車両があります。現在、各ゾーンは各ビークルにマッピングされており、その逆も同様で、現実世界の「最悪のケース」のシナリオを模倣しています。
このストレス テスト データをデータベースに保存する必要があります。これらの 2 つのリストをマップするテーブルには、実行時までに 4,800 万行が含まれるため、いくつかの問題が発生しています。現実の世界では、すべてのアイテムを一度に保存する可能性は非常に低くなりますが、それでも発生します。したがって、これだけの数のアイテムをいつでも確実に保存できるようにする必要がありますが、これにはかなりの時間がかかることがわかっています。
バッチ処理にはステートレス セッションが推奨されることを知っています。ただし、ステートレス セッションはカスケード更新、継承、およびコレクションを完全に無視することを読みました。コミット呼び出し中にスタック オーバーフロー例外を受け取るため、ステートレス セッションでアイテムを保存することは現在不可能です。
私の質問はこれです。最初にすべてのゾーンと車両を保存すると、オブジェクトがデータベースに保持されます。ステートレス セッションを介してリストを保存することは可能ですか? そうでない場合、他の推奨事項はありますか?StatelessSession を使用して試したすべての結果、コレクション例外の永続化は発生しませんでした。
EDIT 通常のセッションを使用して、これらのオブジェクトの保存をトレースしてきました。保存を別のセッションとトランザクションで 100 回ごとに保存すると、Vehicle で SaveOrUpdate を呼び出すたびにゾーンの他のすべてのプロパティが保存されます。
リストのみを保存し、Vehicle または Zone オブジェクト自体に触れないようにする方法はありますか? それは、この最後の部分を機能させるために必要なもののようです。