2012-02-17 10 views
1

実行中のWebサービスがあり、データベースに格納されているデータに基づいてWSDLファイルを生成しています。WSDL Webサービスは、データベースを更新してもデータベースから古いデータを返します。

データベースの一部の列を新しいデータで更新してからWSDLを再ロードすると、Webサービスから古い値が返されます。

EntityManager(javaコード内)などで何かを有効にする必要がありますか?

答えて

2

まず第一に、WSDLのことですか?データベースの変更に際してWSDL(Webサービス契約、言い換えればインタフェース記述)を変更するシステムは想像もできません(もちろん可能です)。

私はそれが変更されるWebサービスの応答だと言われています。 JPAを使用しているようです。ほとんどのJPAプロバイダはいくつかのキャッシュ層を追加します。例えば。 HibernateにはL1キャッシュ、L2キャッシュ、およびクエリキャッシュがあります。データベースを手動で変更する場合、JPAはこれらの変更について認識しておらず、古いデータを引き続き処理します。

使用するJPAプロバイダを指定してください。通常、手動でキャッシュをフラッシュする方法があります(プロバイダまたはキャッシングライブラリのいずれか)。

更新:EclipseLinkを使用していることが判明しました。次のコードでキャッシュをクリアしてみてください:

org.eclipse.persistence.jpa.JpaHelper. 
    getEntityManager(entityManager). 
    getEntityManagerFactory(). 
    getCache(). 
    evictAll(); 

今トリッキーな部分 - はそれを呼び出すには?最良の解決策は、データベースを直接変更するたびにこの機能を実行することです。あなたはそれが直接データベースを変更するPHPスクリプトだと言いました。 PHPからJavaを呼び出すことができます。 JMXとJolokiaを使用するか、別のSOAP Webサービスを公開することができます。

もう1つの解決策は、しばらくの間古いデータを使用することができれば定期的にキャッシュをクリアすることです。一方、すべての更新時にキャッシュをクリアすると、パフォーマンスが低下する可能性があります。

+0

はい、JPAを使用beeingてさ(のEclipseLink JPA)。 WSDLファイル自体はデータベースの変更に伴って変更されるものではなく、Webサービスが新しいデータを取得しないということだけです。データベースは手動で更新されます(少なくともデータベースを更新するWebサービスではなく、更新するPHPコードです)。 – Rox

+0

@Rox:JPA、どんなプロバイダーですか?ハイバーネーター? EclipseLink? OpenJPA?あなたは、キャッシュを無効にするか、PHPスクリプトでキャッシュの無効化を強制する必要があります(難解なJava-PHP統合)。ほとんどの場合、アプリケーションを再起動すると、新しいデータが返されます。 –

+0

申し訳ありません、EclipseLink(私の前のコメントを10秒前に編集しました):-) – Rox

0

あなたのpersistence.xmlに次の行を追加してのEclipseLinkのキャッシュ動作を無効にすることも可能である:

<property name="eclipselink.cache.type.default" value="NONE" /> 
関連する問題