首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复OpenJPA查询SQL缓存错误?

如何修复OpenJPA查询SQL缓存错误?
EN

Stack Overflow用户
提问于 2014-07-21 16:36:33
回答 1查看 267关注 0票数 1

我们使用OPENJPA与Tomcat一起操作,使用Elatic软件编写的遗留专有包org.apache.renamed.openjpa。我们发现关闭QuerySQLCache对于运行一些查询是必要的。例如,以下非常复杂的查询:

选择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.NABLED,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,从TSHIPPINGSERVICELEVEL t0左侧加入TSHIPPINGREGION t1 ON t0.SCCM_UID =t1. WHERE左侧连接TSHIPPINGREGION t2 t0.SHIPPING_REGION_UID =t2.WHERE左左加入TSTORE t0.STORE_UID = t3 WHERE左外连接TLOCALIZEDPROPERTIES t5 ON t0.WHERE= t5.OBJECT_UID和t5. t0.UIDPK左外加入TCATALOG t4 ON t3.CATALOG_UID =t4.WHERE

结果出现错误:

代码语言:javascript
复制
org.apache.renamed.openjpa.persistence.PersistenceException: No value specified for parameter 2 

当缓存关闭时不会发生错误。请注意,此查询的起源来自以特定于OPENJPA的方式编写的复杂的获取关系。

它从查找包含提取组和发货的订单开始(接口ShipOrder)。从ShipOrder (PhysicalOrderShipmentImpl )的实现中获取shippingServiceLevelInternal,这将导致TSHIPPINGSERVICELEVEL的select语句(参见下面的代码)。

代码语言:javascript
复制
@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:调试"org.apache.renamed.openjpa.datacache.QueryKey@9202a145[query:SELECT缓存错过,同时从ShippingRegionImpl sr顺序查找ShippingRegionImpl sr键sr.name,access 子类:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,超时值:1800000]“。catalina.07080951.out:DEBUG Put "org.apache.renamed.openjpa.datacache.QueryKey@9202a145[query:SELECT sr FROM ShippingRegionImpl sr ORDER BY sr.name,access path:com.elasticpath.domain.shipping.impl.ShippingRegionImpl,subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,timeout:1800000]“进入缓存。

是否有任何方法来修复我们的应用程序,允许我们在OpenJPA中打开QuerySQLCache?--抱歉,没有完全清晰的代码示例,整个代码将占用很大的空间。提示是值得赞赏的。

EN

回答 1

Stack Overflow用户

发布于 2014-07-22 13:50:40

有什么方法可以修复我们的应用程序,允许我们在OpenJPA中打开OpenJPA?

简短的回答,很可能不是。QuerySQLCache中有许多已经修复的bug。由于您使用的是重新打包的OpenJPA版本,所以我认为您不可能尝试更新版本的OpenJPA来查看您遇到的问题是否已经解决了?如果这解决了您的问题,您将需要使用弹性路径来更新他们发布的OpenJPA版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24870181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档