Java 我是如何在basex中获得更多性能的?

Java 我是如何在basex中获得更多性能的?,java,jaxb,xquery,basex,Java,Jaxb,Xquery,Basex,实际上,我有一个带有15000个注册中心的basex集合,我正在实现一个jsf和basex应用程序,但我在查询性能方面遇到了一个问题,实际上我正在使用JAXB将xml转换为java中的对象,但速度非常慢,我就是这样做basex查询的: 公共类AssetDao实现Dao{ 公共静态资产DAO实例; 私有字符串db=“deterioro”; 私有字符串assetsModule=“导入模块命名空间资产=”http://creativosdigitales.co/cartera/assets'at'C:

实际上,我有一个带有15000个注册中心的basex集合,我正在实现一个jsf和basex应用程序,但我在查询性能方面遇到了一个问题,实际上我正在使用JAXB将xml转换为java中的对象,但速度非常慢,我就是这样做basex查询的:

公共类AssetDao实现Dao{
公共静态资产DAO实例;
私有字符串db=“deterioro”;
私有字符串assetsModule=“导入模块命名空间资产=”http://creativosdigitales.co/cartera/assets'at'C:/Users/santiago umaña/Google Drive/Deterioro/xquery/assets.xqm';“;
私有字符串模拟module=“导入模块命名空间模拟=”http://creativosdigitales.co/cartera/simulations'at'C:/Users/santiago umaña/Google Drive/Deterioro/xquery/simulations.xqm';“;
公共静态资产dao getInstance(){
if(实例==null){
实例=新AssetDao();
}
返回实例;
}
@凌驾
public List get()抛出IOException、JAXBEException{
列表结果=新建ArrayList();
try(BaseXClient会话=新的BaseXClient(“localhost”,1984,“admin”,“admin”)){
执行(“打开”+db);
最后一个字符串xquery=“对于子序列(//asset,1,20)中的$data,返回{$data/assetid}{$data/payment}{$data/pendingpayments}{format number($data/balance,\“.00\”){{格式编号(//simulation[assetid=$data/assetid]/payment/npv),\“\.00\”{格式编号(//data/balance-sum(//simulation[assetid=$data/assetid]/payment/npv),\”){3500\”} ";
JAXBContext context=JAXBContext.newInstance(Asset.class);
Unmarshaller Unmarshaller=context.createUnmarshaller();
Query=session.Query(xquery);
while(query.more()){
add((Asset)unmarshaller.unmarshal(newstringreader(query.next()));
}
返回结果;
}
}
//自定义方法
公共列表getExtraFields(String assetId)抛出IOException、JAXBEException{
List extraFields=new ArrayList();
try(BaseXClient会话=新的BaseXClient(“localhost”,1984,“admin”,“admin”)){
最终字符串xquery=AssetModule
+“让$db:=集合(''“+db+”)”
+“let$asset:=资产:资产信息($db,”+assetId+”)”
+“返回资产:额外字段($asset)”;
JAXBContext context=JAXBContext.newInstance(ExtraField.class);
Unmarshaller Unmarshaller=context.createUnmarshaller();
Query=session.Query(xquery);
System.out.println(query.toString());
while(query.more()){
add((ExtraField)unmarshaller.unmarshal(newstringreader(query.next()));
}
返回外部字段;
}
}
公共列表getSimulation(String assetId)抛出IOException、JAXBEException{
列表模拟=新的ArrayList();
try(BaseXClient会话=新的BaseXClient(“localhost”,1984,“admin”,“admin”)){
最终字符串xquery=AssetModule
+模拟模块
+“让$db:=集合(''“+db+”)”
+“let$asset:=资产:资产信息($db,”+assetId+”)”
+“返回模拟:模拟xml($asset)”;
JAXBContext context=JAXBContext.newInstance(Simulation.class);
Unmarshaller Unmarshaller=context.createUnmarshaller();
Query=session.Query(xquery);
System.out.println(query.toString());
while(query.more()){
添加((模拟)解组器.unmarshal(新StringReader(query.next())));
}
返回模拟;
}
}
这是我的xquery模块:


您是否在花费这段时间的地方进行了任何测量?JAXB以性能不高而闻名,因此您可能需要对此进行研究。您的查询在性能方面肯定不是最佳的(例如:如果性能对您很重要,则永远不要使用
/
),但是对于您描述的场景,2到3分钟对我来说听起来非常慢。您是否尝试过运行查询,例如使用BaseX GUI,这样您可以看到实际花费的时间(以及BaseX通常需要多长时间)
module namespace assets='http://creativosdigitales.co/cartera/assets';

declare function assets:asset-list() 
{
  for $data in subsequence(//asset, 1, 100) 
  return 
  <asset> 
    {$data/assetid} 
    {$data/payment} 
    {$data/pendingpayments} 
    <balance>{ format-number($data/balance, "#.00") }</balance> 
    <npv>{ format-number(sum(//simulation[assetid=$data/assetid]/payment/npv), "#.00") }</npv> 
    <difference>{ format-number($data/balance - sum(//simulation[assetid=$data/assetid]/payment/npv), "#.00") }</difference> 
   </asset>
};

declare function assets:asset-info($collection, $assetid)
{
  <asset>
  { $collection/*/asset[assetid=$assetid]/*,
    $collection//simulation[assetid=$assetid],
    $collection//punishment[assetid=$assetid] }
  </asset>
};

declare function assets:extra-fields($info)
{
  let $standard := ('assetid','customerid','customername','amount','term','balance','default','rate','payment','pendingpayments', 'paidpayments', 'extrapayments', 'totalnpv', 'punishment', 'expectednpv', 'simulation', 'policy')
  for $x in $info/*[name() != $standard ]
  return
    <extrafield>
      <name>{ $x/name() }</name>
      <text>{ $x/text() }</text>
    </extrafield>
};
@ManagedBean
@XmlRootElement(name="asset")
@XmlType(propOrder = {"assetid", "payment", "pendingpayments", "balance", "npv", "difference"})
public class Asset {
    private String assetid;
    private String payment;
    private String pendingpayments;
    private String balance;
    //net present value
    private String npv;
    //difference between balance and npv
    private String difference; 

    public Asset() {
        // TODO Auto-generated constructor stub
    }

    @XmlElement(name="assetid")
    public String getAssetid() {
        return assetid;
    }

    public void setAssetid(String assetid) {
        this.assetid = assetid;
    }

    @XmlElement(name="payment")
    public String getPayment() {
        return payment;
    }

    public void setPayment(String payment) {
        this.payment = payment;
    }

    @XmlElement(name="pendingpayments")
    public String getPendingpayments() {
        return pendingpayments;
    }

    public void setPendingpayments(String pendingpayments) {
        this.pendingpayments = pendingpayments;
    }

    @XmlElement(name="balance")
    public String getBalance() {
        return balance;
    }

    public void setBalance(String balance) {
        this.balance = balance;
    }

    @XmlElement(name="npv")
    public String getNpv() {
        return npv;
    }

    public void setNpv(String npv) {
        this.npv = npv;
    }

    @XmlElement(name="difference")
    public String getDifference() {
        return difference;
    }

    public void setDifference(String difference) {
        this.difference = difference;
    }
}