2014-07-21 19 views
1

我們將OPENJPA與Tomcat一起使用,並使用由Elatic Path Software準備的舊版專有軟件包org.apache.renamed.openjpa進行操作。我們發現關閉QuerySQLCache對於運行一些查詢是必需的。例如,以下非常複雜的查詢:如何解決OpenJPA查詢SQL CACHE錯誤?

SELECT t0.CARRIER,t0.CODE,t0.DEFAULT_COST,t0.ENABLED,t0.GUID,t0.LAST_MODIFIED_DATE,t1.UIDPK,t1.TYPE,t2.UIDPK, t2.GUID,t2.NAME,t2.REGION_STR,t3.UIDPK,t4.UIDPK,t4.CATALOG_CODE,t4.DEFAULT_LOCALE,t4.MASTER,t4.NAME,t3.STORECODE,t3.CONTENT_ENCODING,t3.COUNTRY,t3。 CREDIT_CARD_CVV2_ENABLED,t3.DEFAULT_CURRENCY,t3.DEFAULT_LOCALE,t3.DESCRIPTION,t3.DISPLAY_OUT_OF_STOCK,t3.EMAIL_SENDER_ADDRESS,t3.EMAIL_SENDER_NAME,t3.ENABLED,t3.NAME,t3.STORE_ADMIN_EMAIL,t3.STORE_FULL_CREDIT_CARDS,t3.STORE_STATE,t3.STORE_TYPE, t3.SUB_COUNTRY,t3.TIMEZONE,t3.URL,t5.OBJECT_UID,t5.UIDPK,t5.TYPE,t5.LOCALIZED_PROPERTY_KEY,t5.VALUE FROM TSHIPPINGSERVICELEVEL t0 LEFT OUTER JOIN TSHIPPINGCOSTCALCULATIONMETHOD t1 ON t0.SCCM_UID = t1.UIDPK LEFT OUTER在t0.SHIP上加入TSHIPPINGREGION t2 PING_REGION_UID = t2.UIDPK LEFT OUTER JOIN TEST t3 ON t0.STORE_UID = t3.UIDPK LEFT OUTER JOIN TLOCALIZEDPROPERTIES t5 ON t0.UIDPK = t5.OBJECT_UID AND? = t5.TYPE LEFT OUTER JOIN TCATALOG t4 ON t3.CATALOG_UID = t4.UIDPK WHERE t0.UIDPK =?

導致錯誤:

org.apache.renamed.openjpa.persistence.PersistenceException: No value specified for parameter 2 

當緩存爲OFF的錯誤不會發生。請注意,此查詢的來源來自以OPENJPA專用方式編寫的複雜獲取關係。
它從查找包含提取組和裝運的訂單(接口ShipOrder)開始。從ShipOrder(PhysicalOrderShipmentImpl)的實現中,我們獲取shippingServiceLevelInternal,它將生成TSHIPPINGSERVICELEVEL的select語句(請參閱下面的一些代碼)。

@FetchGroup(name = FetchGroupConstants.ORDER_SEARCH, attributes = { 
      @FetchAttribute(name = "orderNumber"), 
      @FetchAttribute(name = "shipments"), 
... 
@DataCache(enabled = false) 
public class OrderImpl extends AbstractListenableEntityImpl 
private List<OrderShipment> shipments = new ArrayList<OrderShipment>(); 


public interface PhysicalOrderShipment extends OrderShipment 
... 
ShippingServiceLevel getShippingServiceLevel(); 

@FetchGroup(name = FetchGroupConstants.ORDER_DEFAULT, attributes = { 
    @FetchAttribute(name = "shipmentAddressInternal"), 
    @FetchAttribute(name = "shippingServiceLevelInternal") 
}, fetchGroups = { FetchGroupConstants.DEFAULT }, postLoad = true) 
}) 
@DataCache(enabled = false) 
public class PhysicalOrderShipmentImpl extends AbstractOrderShipmentImpl implements PhysicalOrderShipment { 
... 
/** 
* Gets the shipping service level. 
* 
* @return ShippingServiceLevel the shipping service level 
*/ 
ShippingServiceLevel getShippingServiceLevel(); 

從日誌中我也看到了一些querySQL所緩存的問題:

catalina.07080951.out:DEBUG 緩存未命中而查找鍵「org.apache.renamed.openjpa.datacache.QueryKey @ 9202a145 [查詢:[SELECT sr FROM ShippingRegionImpl sr ORDER BY sr.name],訪問路徑:[com.elasticpath.domain.shipping.impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,超時:1800000]」。 catalina.07080951.out:DEBUG將關鍵字「[email protected] [查詢:[SELECT sr FROM ShippingRegionImpl sr ORDER BY sr.name],訪問路徑:[com.elasticpath.domain。 「shipping.impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,timeout:1800000]」到緩存中。

有什麼辦法可以修復我們的應用程序,讓我們可以打開OpenJPA中的QuerySQLCache? 對不完整的代碼示例,整個代碼將佔用大量的空間。提示是讚賞。

回答

1

Is there any way to fix our application allowing us to turn on QuerySQLCache in OpenJPA?

簡短的回答,很可能不是。已經修復了QuerySQLCache中的許多錯誤。由於您使用的是OpenJPA的重新打包版本,我不認爲您有可能嘗試更新版本的OpenJPA來查看您遇到的問題是否已修復?如果這樣可以解決您的問題,那麼您需要使用Elastic Path來更新他們發佈的OpenJPA版本。