Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复OpenJPA查询SQL缓存错误?_Java_Sql_Caching_Openjpa - Fatal编程技术网

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

Java 如何修复OpenJPA查询SQL缓存错误?,java,sql,caching,openjpa,Java,Sql,Caching,Openjpa,我们使用OPENJPA,Tomcat使用Elatic Path软件准备的遗留专有包org.apache.rename.OPENJPA进行操作。我们发现关闭QuerySQLCache对于运行某些查询是必要的。例如,以下非常复杂的查询: 选择t0.CARRIER、t0.CODE、t0.DEFAULT\u COST、t0.ENABLED、t0.GUID、t0.LAST\u MODIFIED\u DATE、t1.UIDPK、t1.TYPE、t2.UIDPK、t2.GUID、t2.NAME、t2.REGI

我们使用OPENJPA,Tomcat使用Elatic Path软件准备的遗留专有包org.apache.rename.OPENJPA进行操作。我们发现关闭QuerySQLCache对于运行某些查询是必要的。例如,以下非常复杂的查询:

选择t0.CARRIER、t0.CODE、t0.DEFAULT\u COST、t0.ENABLED、t0.GUID、t0.LAST\u MODIFIED\u DATE、t1.UIDPK、t1.TYPE、t2.UIDPK、t2.GUID、t2.NAME、t2.REGION\u STR、t3.UIDPK、t4.CATALOG\u CODE、t4.DEFAULT\u LOCALE、t4.MASTER、t4.NAME、t3.STORECODE、t3.CONTENT\u编码、t3.COUNTRY、t3.CREDIT\u信用卡\u CVV2启用、t3.DEFAULT\u币种、t3.DEFAULT\u LOCALE,t3.DESCRIPTION,t3.DISPLAY\u OUT\u STOCK,t3.EMAIL\u SENDER\u ADDRESS,t3.EMAIL\u SENDER\u NAME,t3.ENABLED,t3.NAME,t3.STORE\u ADMIN\u EMAIL,t3.STORE\u FULL\u CREDIT\u CARDS,t3.STORE\u STATE,t3.STORE\u TYPE,t3.SUB\u COUNTRY,t3.TIMEZONE,t3.URL,t5.OBJECT.UID,t5.UID,t5.UID,t5.UIDPK,t5.PROPERTY\u KEY,t5.VALUE 从TSHIPPINGSERVICELEVEL t0到t0上的左外连接TshippingCostCalculation方法t1.SCCM_UID=t1.UIDPK到t0上的左外连接TSHIPPINGREGION t2.SHIPPING_REGION_UID=t2.UIDPK到t0上的左外连接TSTORE t3.STORE_UID=t3.UIDPK到t0上的左外连接TLOCALIZEDPROPERTIES t5.UIDPK=t5.OBJECT_UID和?=t5.在t3上键入左外连接TCATALOG t4.CATALOG_UID=t4.UIDPK 其中t0.UIDPK=

导致错误的原因:

org.apache.renamed.openjpa.persistence.PersistenceException: No value specified for parameter 2 
当缓存关闭时,不会发生此错误。请注意,此查询的来源是以特定于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:查找关键字org.apache.rename.openjpa.datacache时调试缓存未命中。QueryKey@9202a145[查询:[按sr.name从ShippingRegionImpl sr订单中选择sr],访问路径:[com.elasticpath.domain.shipping.impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,超时:1800000]。 catalina.07080951.out:DEBUG Put key org.apache.rename.openjpa.datacache。QueryKey@9202a145[查询:[按sr.name从ShippingRegionImpl sr订单中选择sr],访问路径:[com.elasticpath.domain.shipping.impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,超时:1800000]进入缓存

有没有办法修复我们的应用程序,允许我们在OpenJPA中打开QuerySQLCache? 很抱歉没有完全清楚的代码示例,整个代码将占用大量空间。谢谢你的提示

有没有办法修复我们的应用程序,允许我们在OpenJPA中打开QuerySQLCache

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