Java 我是如何在basex中获得更多性能的?
实际上,我有一个带有15000个注册中心的basex集合,我正在实现一个jsf和basex应用程序,但我在查询性能方面遇到了一个问题,实际上我正在使用JAXB将xml转换为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:
公共类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;
}
}