2017-02-10 35 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的一個分支:

從那時起事情可能已經發生了變化,但是這個分支會給你很好的指導。最好是如果您將項目分開,並在完成後將您的工作作爲拉取請求提交。

相關問題