【问题标题】:Adding aggregate function to external H2 database向外部 H2 数据库添加聚合函数
【发布时间】:2011-11-04 11:32:33
【问题描述】:

我正在尝试使用 Java 在我的 H2 数据库中创建一个聚合函数。 该函数应从给定的 Double 列返回自定义中值计算。 此计算包括仅使用与 max_variance int 值的平均值足够接近的值。为此我创建了这个类:

package custommedian;

public class CustomMedian implements org.h2.api.AggregateFunction{
    final int max_variance = 7;
    java.util.LinkedList<Double> values = new java.util.LinkedList<Double>();

    @Override
    public void init(java.sql.Connection cnctn) throws java.sql.SQLException {
        // I ignored this
    }

    @Override
    public int getType(int[] ints) throws java.sql.SQLException {
       return java.sql.Types.DOUBLE;
    }

    @Override
    public void add(Object o) throws java.sql.SQLException {
        values.add((Double)o);
    }

    @Override
    public Object getResult() throws java.sql.SQLException {
        double average = 0;
        java.util.Iterator<Double> i;
        java.util.LinkedList<Double> properValues = new java.util.LinkedList<Double>();

        // Get average value
        for( i = values.iterator(); i.hasNext(); ) {
            average += i.next();    
        }
        average = average / values.size();

        // Filter out invalid values
        for( i = values.iterator(); i.hasNext(); ) {
            double value = i.next();
            if (value - max_variance < average && value + max_variance > average){
                properValues.add(value);
            }
        }

        // Sort list
        java.util.Collections.sort(properValues);

        // Return median
        int size = properValues.size();
        if (size > 0){
            int pos = ((int) size/2);
            // Odd size
            if ((size%2) == 1 ) return properValues.get(pos);
            // Even size
            else return ( properValues.get(pos-1) + properValues.get(pos) ) / 2;
        }
        else 
            return null;
    }
}

现在我应该编译它,以便数据库可以访问它并使用以下命令:

CREATE AGGREGATE MEDIAN FOR "custommedian.CustomMedian";

我该怎么做呢?

我尝试将 .jar 文件放在与数据库文件相同的文件夹中,但似乎找不到类:

Class "custommedian.CustomMedian" not found; SQL statement:

谁能告诉我我还需要做什么才能完成这项工作?

提前非常感谢!

编辑:

已解决:

正如 Lukas 建议的那样,我最终将 H2 jar 嵌入到我的应用程序中,这样就不存在类路径问题。

【问题讨论】:

    标签: java database aggregate-functions h2


    【解决方案1】:

    您是否已将您的类添加到 H2 数据库进程的类路径中? IE。什么时候启动H2数据库?

    另一种方法是分叉 H2 并构建它,包括您的自定义聚合函数。或者只是将您的 .class 文件放在 H2 jar 文件中,这取决于您必须多久更新一次自己的代码,这也可能没问题。那么它肯定会在类路径上......

    在最坏的情况下,H2 用户群非常活跃:

    http://groups.google.com/group/h2-database

    【讨论】:

    • 您好 Lukas,感谢您的回答!我只是不知道如何将它添加到 H2 类路径中......如果将它包含在 H2 jar 中,具体在哪里?在根 (/org/h2) 或任何其他子文件夹中?再次感谢!
    • 关于类路径,这取决于你如何使用 H2(我猜,不是嵌入的)。你用来启动 H2 的命令行语句是什么?如果您将其包含在 jar 文件中,请尝试将此结构添加到 .jar 的“根”:/custommedian/CustomMedian.class
    • 是的,没有嵌入,在问题中添加了解释。现在我正在考虑嵌入它,也许将它们放在一起会更好。
    • 嵌入将解决类路径问题,因为数据库将在同一个 JVM 中运行...
    • 我几乎被说服嵌入它。但是我仍然很好奇我应该如何按照现在的方式进行操作,如何使用外部 H2 jar 解决类路径问题?
    【解决方案2】:

    当将 H2 服务器作为外部进程运行时,可以使用 java -cp &lt;dir&gt; ... 将类添加到类路径中。

    使用h2.shh2.bat启动H2服务器时,可以将目录添加到环境变量%H2DRIVERS%%CLASSPATH%中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多