2

Oracle10gおよびSQLServer2008でNH3.3.1.4000を使用しています。

最近、このバグの可能性に遭遇しました。次の2つのクエリについて考えてみます。

var query1 = session.Query<Content>().Cacheable()
                    .Where(c => c.Name == "test-test").ToList();

var query2 = session.CreateQuery("from Content c where c.Name = :name")
                    .SetString("name", "test-test")
                    .SetCacheable(true); 
var list = query.List<Content>();

上記のクエリのいずれかにより、次のSQLクエリが生成されます。

select content0_.Id       as Id6_,      
content0_.Name   as Name6_,      
from   Content content0_
where  content0_.Name = ''

渡され、「-」(ハイフン)を持つパラメーターは、実際のSQLクエリには到達しません。

パラメータの.CacheableまたはSetCacheable()または「-」を削除すると、正しく機能します。NHソースコードを調べ始める前の回避策について何かアイデアはありますか?ありがとう。

更新SQLServer にも同じ問題が存在することを確認できます。クエリキャッシュではなく、データベースとは何の関係もないと思います。クエリを最初に実行するとき、キャッシュが実行される前に、生成されるクエリは正しいことを述べておく必要があります。しかし、同じクエリを2回実行すると、今回はクエリキャッシュからの読み込みで、ハイフンでキャッシュできません。.NetMVCアプリでSQLServer2008を使用して実行した次のテストを参照してください。

var test1 = session.Query<Student>().Cacheable().Where(c => c.Firstname == "first-name").ToList();

var test2 = session.Query<Student>().Where(c => c.Firstname == "first-name").ToList();

var test3 = session.Query<Student>().Cacheable().Where(c => c.Firstname == "firstname").ToList();

初めてページを読み込んだときに、次のクエリが生成され、すべて正解でした。

-- statement #1
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = 'first-name'

-- statement #2
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = 'first-name'

-- statement #3
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = 'firstname'

しかし、ページをリロードし、Query Cacheに処理を任せた後、次の3つのクエリを取得します。

-- statement #1
Cached query: 
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = ''

-- statement #2
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = 'first-name'

-- statement #3
Cached query: 
select student0_.Id        as Id1_,
   student0_.Firstname as Firstname1_,
   student0_.Lastname  as Lastname1_
from   Students student0_
where  student0_.Firstname = 'firstname'

ご覧のとおり、2回目のステートメント#1ではパラメーターが空です。ステートメント#1とステートメント#2の唯一の違いは、クエリキャッシュの使用です。キャッシュされたクエリは、パラメータに「-」ハイフンがない限り、2番目のロード(test3)で正常に機能します。

4

1 に答える 1

0

これは、NHibernate やクエリ キャッシュではなく、 NHibernate Profilerのバグに違いないようです。プロファイラーで空の文字列として表示される、キャッシュされたクエリのハイフンを含むパラメーターに関する問題を再現できました。

ただし、テストでは常に正しい結果セットが得られます。ロガーのデバッグ レベルを有効NHibernate.Cache.StandardQueryCacheにすると、クエリ キャッシュがこれらの空の文字列パラメーターを認識せず、ハイフン付きの実際のパラメーター値が認識されることも示されます。

私の結論は、キャッシュされたクエリを一覧表示するときに、プロファイラーがこれらのパラメーターを正しく表示しないということです。

于 2014-03-04T15:54:37.617 に答える