2017-02-10 60 views
1

我想为ActiveJDBC添加一些对Apache Phoenix的支持。我使用ActiveJDBC简单示例项目作为测试,并对ActiveJDBC 2.0-SNAPSHOT(最新来自github)的克隆进行更改。要将Phoenix对ActiveJDBC的支持添加到哪些步骤?

所以在ActiveJDBC远2.0-快照我有:

  • 创建在org.javalite.activejdbc.dialects一个PhoenixDialect类 覆盖所述插入方法(菲尼克斯使用UPSERT)
  • 如果节加入在 配置

的getDialect(字符串DBTYPE)方法在简单示例项目我有:

  • 加入凤客户端作为依赖(我们使用菲尼克斯HortonWorks HDP 2.5.3.0的 部分上HBase的1.1.2.2.5)
  • 设置database.properties凤凰值
  • 创建的在凤凰城的相关表手动(DB-迁移并 不是出于显而易见的原因工作)

但是,数据库方言不被认可,是的,我相信,默认为DefaultDialect我得到一个凤凰错误凤凰文法中未被识别的“INSERT”的使用。 Phoenix grammar

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

我也怀疑凤凰JDBC驱动程序可能不支持getDbName()类方法,凤凰司机,当被问到对于为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(); 
     } 

数据库。性能

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

回答

0

下面是用于SQLServer的新方言,测试套件和其他相关的东西整合了一个分支:

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

这里是H2的一个分支:

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

相关问题