Oracle Maximo Assetspec自动化脚本缓慢和错误

Oracle Maximo Assetspec自动化脚本缓慢和错误,oracle,automation,jython,maximo,Oracle,Automation,Jython,Maximo,下面是我的自动化脚本,它是资产加载过程的第二部分。第一部分在从外部系统创建时将属性数据加载到资产,但它还设置CLASSIFICATIONID,该ID在触发以下脚本的ASSETSPEC表中创建记录: from psdi.mbo import MboConstants from psdi.server import MXServer from psdi.security import UserInfo username = "maxadmin" mxServer = MXServer.getMX

下面是我的自动化脚本,它是资产加载过程的第二部分。第一部分在从外部系统创建时将属性数据加载到资产,但它还设置CLASSIFICATIONID,该ID在触发以下脚本的ASSETSPEC表中创建记录:

from psdi.mbo import MboConstants
from psdi.server import MXServer
from psdi.security import UserInfo

username = "maxadmin"

mxServer = MXServer.getMXServer()
userInfo = mxServer.getUserInfo(username)

if mbo != None:
    mxAssetSpec = mbo

    AssetNum = mxAssetSpec.getString("assetnum")
    SiteID = mxAssetSpec.getString("siteid")

    gisAssetSet = mxServer.getMboSet(FEATURECLASS, userInfo)
    gisAssetSet.setWhere("mxassetnum = '" + AssetNum + "' and mxsiteid = '" + SiteID + "'")
    gisAssetSet.reset()

    gis = gisAssetSet.getMbo(0)

    if FEATURECLASS == "GRAVITYSEWERLINES":
        if ASSETATTRID == 'MATERIAL':
            mxAssetSpec.setValue("alnvalue", gis.getString("material"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'LENGTH':
            mxAssetSpec.setValue("numvalue", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'INSTALL':
            mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'ESTYEAR':
            mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'PDIAM':
            mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')

    mxAssetSpec.save()
    mxAssetSpec.close()
    mxAssetSpec.resetForRefreshOnSave()

else:
    raise UnboundLocalError
它循环使用大约8个分类属性。脚本本身运行速度非常快,但每个分类属性之间有大约3秒的暂停。我还得到一个oracle错误:

java.sql.SQLException:ORA-00904:“ASSETNUM”:无效标识符

我引用ASSETNUM的唯一地方是当我从ASSETSPEC MBO检索字符串时,ASSETNUM是其中的一个属性,因此我不明白为什么会出现此错误

我的问题是,为什么会出现无效标识符错误,为什么会出现暂停,它们是否相互关联

脚本需要大约20秒才能完成,工作正常,但20秒太长了约19秒。任何帮助都将不胜感激。如果您对如何改进代码有任何意见,我们将不胜感激

谢谢

if mbo != None:
mxAssetSpec = mbo

mxAssetSet = mxAssetSpec.getMboSet("ASSET")
mxAsset = mxAssetSet.getMbo(0)
featureclass = mxAsset.getString("PLUSSFEATURECLASS")
assetattrid = mxAssetSpec.getString("ASSETATTRID")

print(featureclass)
print(assetattrid)

if featureclass == "GRAVITYSEWERLINES":
    gisAssetSet = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES")
    gis = gisAssetSet.getMbo(0)
    length = gis.getString("length_")
    if assetattrid == 'MATERIAL':
        mxAssetSpec.setValue("alnvalue", gis.getString("material"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'LENGTH':
        mxAssetSpec.setValue("numvalue", gis.getString("length_"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'INSTALL':
        mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'ESTYEAR':
        mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'PDIAM':
        mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')

    mxAssetSpec.save()
其他:
raise UnboundLocalError

以下是一些提高脚本性能的方法。我将给出它们作为一般规则,然后给出如何应用它们的示例

规则:不要在你的脚本中做你能让Java做的事情,因为编译过的Java比你的脚本快

应用程序:我不会从mxserver获取GiAssetSet,而是将关系放在AssetSpec上,并通过mbo.getMboSet(“关系”)使用它。这使得Java可以进行字符串操作,而拥有事务可以进行保存

规则:安装和拆卸都很昂贵,所以尽量减少和避免它们

应用程序1:我假设您使用的是对象启动点。尽可能使用对象事件条件来阻止脚本在不应该运行时运行。这样可以避免设置和拆卸

应用程序2:不要在启动点上使用绑定变量,而是使用mbo.get方法。每个绑定的启动点变量会导致大约5个额外的相关变量,从而增加设置和拆卸时间。您可以在关于隐式变量的部分中了解更多有关这方面的信息

规则:不要为同一个属性调用mbo.getWhather()两次

应用程序:有两种情况下,您会连续调用getString(“长度”)。我认为如果只调用一次,将返回的值缓存在变量中,然后多次使用该变量,代码的性能会更好

至于你得到的Oracle错误,我觉得我没有足够的信息。是否有其他脚本或交叉点等在起作用?换言之,您如何知道此错误是由此脚本引起的


我希望这会有所帮助。

我试图重写您的代码,删除ifs并使用elifs来减少冗余。如果我在你的位置,我会使用ASSET作为主mbo,并使用自定义GetMBoset访问每个ASSETSPEC mbo,这样就不会对每个SPEC记录的ASSET表运行5次sql命令。如果这两种方法都不起作用,最好在夜间使用升级和操作启动点运行代码。 顺便说一句,如果使用GetMBoset,也不需要运行.save()

mxAssetSpec = mbo
mxAsset = mxAssetSpec.getMboSet("ASSET").moveFirst()
featureclass = mxAsset.getString("PLUSSFEATURECLASS")
assetattrid = mxAssetSpec.getString("ASSETATTRID")

if featureclass == "GRAVITYSEWERLINES" and assetattrid in ["MATERIAL","LENGTH","INSTALL","ESTYEAR","PDIAM"]:
    gis = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES").moveFirst()
    if gis is not None:
        length = gis.getString("length_")
        if assetattrid == "MATERIAL":
            mxAssetSpec.setValue("alnvalue", gis.getString("material"))
        elif assetattrid == "LENGTH":
            mxAssetSpec.setValue("numvalue", length)
        elif assetattrid == "INSTALL":
            mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
        elif assetattrid == "ESTYEAR":
            mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
        elif assetattrid == "PDIAM":
            mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
        mxAssetSpec.setValue("startmeasure", "0")
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", "FT")
        mxAssetSpec.setValue("endmeasureunitid", "FT")

我在上面添加了新代码,但每个资产规格属性之间仍有大约3秒的暂停。如果在16毫秒内触发,则脚本本身将被激活,但每个资产规格属性的触发间隔约为3秒。此脚本是加载过程的第二部分。第一个脚本复制属性信息,并设置CLASSIFICATIONID,然后触发此脚本。不要调用mxAssetSpec.save()。通常,如果从MXServer获取MboSet,则只应在MboSet上调用save()。此外,就编码风格而言,我倾向于不将mbo别名为mxAssetSpec。对我来说,将其称为“mbo”提醒我,它是由Maximo提供的,可能指的是不同的对象,具体取决于发射点。谢谢,但每个AssetTrid之间仍会暂停约3秒。代码本身运行速度非常快,但系统似乎在每个属性之间暂停约3秒。它正在运行每个assetspec属性的代码。我有一个演示系统,我可以测试这个。我将尝试一下,看看是否得到相同的结果即使代码中没有save()调用,暂停是否仍在发生?