2017-08-11 20 views
0

在Groovy文件后,运行它,我收到来自具有由用户输入的Groovy脚本的字段输入,让我们说:如何存储编译的Groovy脚本在数据库中以后取出,并结合所必需的变量

def x = a + 5 println x

我看这是一个字符串,并将其存储在一个变量说script.Then我使用类似编译此脚本: Script s = new GroovyShell().parse(script) 现在,我想是存储该对象s Oracle数据库中。它的目的是,只要我需要,我可以获取从DB编译代码,并使用类似的变量绑定到它运行它:

Binding b = new Binding().setVariable('a', 5)) s.setBinding(b) //s fetched from database s.run()

问题:如何保存这些脚本对象S在DB。我试了一下Blob中使用插入: ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = null; try { out = new ObjectOutputStream(bos); out.writeObject(s); byte[] yourBytes = bos.toByteArray(); b = sql.getConnection().createBlob(); b.setBytes(1, yourBytes); } finally { out.close(); bos.close(); }

但这似乎可能没有,因为在序列化对象s,我得到以下异常: Caught: java.io.NotSerializableException: org.codehaus.groovy.runtime.InvokerHelper$2 java.io.NotSerializableException: org.codehaus.groovy.runtime.InvokerHelper$2 at java_io_ObjectOutput$writeObject.call(Unknown Source)

什么,我希望在这里实现的性能优化。不要一次又一次地编译和运行Groovy脚本,我希望它能够编译一次,并在绑定数据时随时运行。

在此先感谢。

+0

仔细阅读文章ab groovy类加载器,嵌入,脚本类(需要时智能重新编译)。我认为你的问题,在加载可能你需要扩展GroovyClassLoader –

+0

保存代码不完整是一个问题。什么是'?'不存储“脚本”对象(我相信是不可Seriazable,理解为什么),但类 –

+0

S是我的编译脚本对象。是的,我知道对象不能被序列化导致异常。我只是指定这是我尝试的解决方案,但没有工作。我在寻找的是执行此任务的任何可行的替代解决方案。 – Nitin

回答

1

我会将脚本作为字符串(varchar)存储在数据库中。我会在第一次命中时编译命中,但是然后缓存编译后的脚本。缓存键将是脚本源或它的散列键,所以如果源更改,它将重新编译。其他优化可以使用数据库通知来实现。

+0

在我的方案中,一个应用程序负责生成脚本并存储它,而另一个应用程序正在使用该脚本来获取结果。作为两个独立的应用程序,它们之间没有共享缓存.SO,我无法缓存编译的脚本并在需要时使用它。而且,如果我将编译的脚本作为字符串存储在数据库中,如何在需要时使用它?因为字符串不能转换回用于运行它的脚本对象。 – Nitin

相关问题