我正在尝试向 ActiveJDBC 添加一些对 Apache Phoenix 的支持。我正在使用 ActiveJDBC 简单示例项目作为测试,并对 ActiveJDBC 2.0-SNAPSHOT 的克隆(最新来自 github)进行更改。
到目前为止,在 ActiveJDBC 2.0-SNAPSHOT 我有:
- 在 org.javalite.activejdbc.dialects 中创建了一个 PhoenixDialect 类来覆盖插入方法(Phoenix 使用 UPSERT)
- 在 Configuration 中的 getDialect(String dbType) 方法中添加了一个 if 节
在简单示例项目中,我有:
- 添加了 phoenix-client 作为依赖项(我们在 HBase 1.1.2.2.5 上使用 Phoenix 作为 HortonWorks HDP 2.5.3.0 的一部分)
- 使用 Phoenix 值设置 database.properties
- 手动在 Phoenix 中创建了相关表(db-migrate 不工作,原因很明显)
但是,数据库方言未被识别,并且我相信默认为 DefaultDialect,因为我在使用 Phoenix 语法中无法识别的“INSERT”时收到 Phoenix 错误。凤凰语法
添加对其他方言的支持时,我是否缺少其他步骤?
我还怀疑 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();
}
数据库属性
development.driver=org.apache.phoenix.jdbc.PhoenixDriver
development.username=anything
development.password=anything
development.url=jdbc:phoenix:hdp-c21:2181:/hbase-unsecure