【问题标题】:Groovy script hangsGroovy 脚本挂起
【发布时间】:2012-11-15 00:16:44
【问题描述】:

我在 WinXP(版本:Excel 97-2000)中为一个非常简单的 Excel 电子表格设置了一个用户 DSN ODBC 数据源:

A_NUMBER  A_DATE      A_STRING
1001      10/1/2012   Red
1002      10/2/2012   Green
1003      10/3/2012   Blue

当我运行以下 groovy 脚本(Groovy 版本:1.7.8 JVM:1.6.0_10)来读取数据时

import groovy.sql.Sql

def static main(def args) {
    def dbParameters = [url: 'jdbc:odbc:mySpreadSheet', user:'', password:'', driver: 'sun.jdbc.odbc.JdbcOdbcDriver']          
    def sql = Sql.newInstance(dbParameters)

    sql.eachRow('select * from [Sheet1$]') { row ->
        println "${row.A_NUMBER} ${row.A_DATE} ${row.A_STRING}"         
    }

    sql.close()

    println "done???"
}

它产生以下输出:

1001.0 2012-10-01 00:00:00.0 Red
1002.0 2012-10-02 00:00:00.0 Green
1003.0 2012-10-03 00:00:00.0 Blue
done???

但它永远不会退出!

我尝试从 Windows 命令提示符和 cygwin bash shell 运行它,在这两种情况下它都会挂起,直到我用 ctrl-c 杀死它

我可以通过添加强制脚本退出

throw new RuntimeException("force exit")

在 println 之后,但这似乎很极端。

知道为什么脚本会挂起吗?

【问题讨论】:

  • 您是否尝试过不使用“def static main”并将所有代码放在方法之外?
  • 是的。结果相同。还尝试使它成为一个真正的类并在 main 中创建它的一个新实例。没有运气:(
  • 我还“尝试关闭再打开”并重新创建 ODBC 数据源。
  • System.exit(0) 会好一点...
  • 谢谢拉尔夫。我对此表示怀疑,但我尝试过并且有效。比抛出运行时异常要干净得多。仍然好奇为什么没有 System.exit(0) 调用它会挂起......

标签: excel jdbc groovy


【解决方案1】:

从未真正找到答案,但最好的建议是来自 Ralf,它是添加该行

System.exit(0)

在 main 方法的末尾。

【讨论】:

    【解决方案2】:

    我使用您的代码自己设置了这个测试,完全按照原样进行,完成后退出脚本没有任何问题。我认为这与您的 Cygwin shell 有关。如果您在常规的 DOS shell 中运行它,您可能会发现它正确退出。

    import groovy.sql.Sql
    def static main(def args) {
        def dbParameters = [url: 'jdbc:odbc:RefList10000', user:'', password:'', driver: 'sun.jdbc.odbc.JdbcOdbcDriver']          
        def sql = Sql.newInstance(dbParameters)
        sql.eachRow('select * from [referenceList10000$]') { row ->
            println "${row.RefListName} ${row.Value}"         
        }
        sql.close()
        println "done"
    }
    

    发起人:

    @echo off
    :: Microsoft Windows [Version 6.1.7601]
    SET JAVA_HOME=C:\Java\jdk1.6.0_33_x32
    SET PATH=%JAVA_HOME%\bin;%PATH%
    groovy SQL.gv
    pause
    

    【讨论】:

    • 感谢您的回复。对我来说,从 Windows 命令提示符运行就像我的 cygwin bash shell(如上所述)一样挂起。有趣的是,你的有效而我的无效。我注意到你的 jdk 比我的稍新。你的 groovy 版本是什么?
    • 我将我的 jdk 升级到 1.6.0_33,但在 DOS shell 或其他方面仍然没有运气。
    • 您的 excel 驱动程序是什么版本(在驱动程序下的 ODBC 数据源管理器中)?我的是 4.00.6305.00
    • 我使用 32 位 JDK 和 32 位 Excel ODBC 系统 DSN v.12.00.6015.1000(不是 6.01.7601.17632)。请参阅 Groovy JMX 文档,然后使用 JVisualVM 查找挂起的线程……这就是我要做的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2020-06-14
    • 1970-01-01
    • 2012-08-01
    • 2012-11-13
    • 2014-11-24
    • 2011-05-12
    • 2014-10-19
    相关资源
    最近更新 更多