将Phoenix支持添加到ActiveJDBC需要哪些步骤?

时间:2017-02-10 14:04:15

标签: phoenix activejdbc

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

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

  • 在org.javalite.activejdbc.dialects中创建了一个PhoenixDialect类 覆盖插入方法(Phoenix使用UPSERT)
  • 在if中的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,因为我在使用“INSERT”时遇到凤凰错误,这在凤凰语法中是无法识别的。 Phoenix grammar

在添加对其他方言的支持时,是否还有其他步骤?

我还怀疑Phoenix jdbc驱动程序可能不支持getDbName()类型方法,Phoenix驱动程序,当要求getPropertyInfo()返回EMPTY_INFO时,请参阅PhoenixEmbeddedDriver

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

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

到目前为止我们所拥有的部分:

PhoenixDialect

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

1 个答案:

答案 0 :(得分:0)

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

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

这是h2的分支:

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

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