【问题标题】:What steps are required to add support for Phoenix to ActiveJDBC?将 Phoenix 支持添加到 ActiveJDBC 需要哪些步骤?
【发布时间】:2017-02-10 14:04:14
【问题描述】:

我正在尝试向 ActiveJDBC 添加一些对 Apache Phoenix 的支持。我正在使用 ActiveJDBC 简单示例项目作为测试,并对 ActiveJDBC 2.0-SNAPSHOT 的克隆(最新来自 github)进行更改。

到目前为止,我在 ActiveJDBC 2.0-SNAPSHOT 中拥有:

  • 在 org.javalite.activejdbc.dialects 中创建了 PhoenixDialect 类以 覆盖插入方法(Phoenix 使用 UPSERT)
  • 在 getDialect(String dbType) 方法中添加了一个 if 节 配置

在我的简单示例项目中:

  • 添加了 phoenix-client 作为依赖项(我们使用 Phoenix 作为 HBase 1.1.2.2.5 上的 HortonWorks HDP 2.5.3.0 的一部分)
  • 用 Phoenix 值设置 database.properties
  • 在 Phoenix 中手动创建了相关表(db-migrate 确实 由于明显的原因无法正常工作)

但是,数据库方言未被识别,并且我相信默认为 DefaultDialect,因为我在使用 Phoenix 语法中无法识别的“INSERT”时收到 Phoenix 错误。 Phoenix grammar

在添加对其他方言的支持时,我是否缺少其他步骤?

我还怀疑 Phoenix jdbc 驱动可能不支持 getDbName() 类型的方法,Phoenix 驱动在询问 getPropertyInfo() 时返回 EMPTY_INFO,参见PhoenixEmbeddedDriver

如果驱动程序没有返回 DbName,是否有解决方法?

值得一提的是,我们使用标准 Java jdbc 类(PreparedStatement 和所有好东西)成功地与 Phoenix 交互,但 ActiveJDBC 更优雅,我们愿意使用它。

我们目前所拥有的部分:

凤凰方言

import java.util.Iterator;
import java.util.Map;

import org.javalite.activejdbc.MetaModel;
import static org.javalite.common.Util.join;

public class PhoenixDialect extends DefaultDialect {

    @Override
    public String insert(MetaModel metaModel, Map<String, Object> attributes) {
       StringBuilder query = new StringBuilder().append("UPSERT INTO ").append(metaModel.getTableName()).append(' ');
       if (attributes.isEmpty()) {
           appendEmptyRow(metaModel, query);
       } else {
           boolean addIdGeneratorCode = (metaModel.getIdGeneratorCode() != null
                   && attributes.get(metaModel.getIdName()) == null); // do not use containsKey
           query.append('(');
           if (addIdGeneratorCode) {
               query.append(metaModel.getIdName()).append(", ");
           }
           join(query, attributes.keySet(), ", ");
           query.append(") VALUES (");
           if (addIdGeneratorCode) {
               query.append(metaModel.getIdGeneratorCode()).append(", ");
           }
           Iterator<Object> it = attributes.values().iterator();
           appendValue(query, it.next());
           while (it.hasNext()) {
               query.append(", ");
               appendValue(query, it.next());
           }
           query.append(')');
       }
       return query.toString();
   }
}

配置

   public Dialect getDialect(String dbType) {

      Dialect dialect = dialects.get(dbType);
      if (dialect == null) {
         if (dbType.equalsIgnoreCase("Oracle")) {
            dialect = new OracleDialect();
         }
         else if (dbType.equalsIgnoreCase("Phoenix")) {
            dialect = new PhoenixDialect();
         }
         else if (dbType.equalsIgnoreCase("MySQL")) {
            dialect = new MySQLDialect();
         }

database.properties

development.driver=org.apache.phoenix.jdbc.PhoenixDriver
development.username=anything
development.password=anything
development.url=jdbc:phoenix:hdp-c21:2181:/hbase-unsecure

【问题讨论】:

    标签: phoenix activejdbc


    【解决方案1】:

    这是一个用于将 SQLServer 与新的 Dialect、测试套件和其他相关内容集成的分支:

    https://github.com/javalite/activejdbc/tree/sql_server_integration

    这里是 h2 的一个分支:

    https://github.com/javalite/activejdbc/commits/h2integration

    从那时起事情可能已经发生了变化,但是这个分支会给你很好的指导。最好是你 fork 项目,并在完成后将你的工作作为拉取请求提交。

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多