我想爲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