我们正在使用Azure和Phoenix写入HBase群集。有两个驱动程序:一个大客户端和一个瘦客户端。瘦客户端使用Json over HTTP与数据库进行交互。
当我们创建一个新的连接时,每次保存我们可以节省大约150毫秒。
this.conn = DriverManager.getConnection("jdbc:phoenix:thin:url=http://1.1.1.1");
当我们重用连接时,我们可以在每次保存70ms内完成:显着的加速。文档有点含糊不清,在厚实和思考客户端之间转换。
那么汇集瘦客户端连接的最佳做法是什么?
重要变更!
我们开始遇到连接问题所以我想回到我们的代码并进行一些更改。我设置了一些定时器,发现上面的代码工作在0ms。我不确定我上面做错了什么。
所以游泳凤凰的正确方法是不要游泳菲尼克斯。有几个帖子可以从开发团队确认这一点。
拥有庞大的SQL Oracle / DB2 / SqlServer背景可能是我的撤销。使用Redis或Phoenix或者任何新的No-sql数据库与SQL非常不同。我的建议是"阅读说明"您正在使用的产品并按照他们的要求去做!
答案 0 :(得分:0)
根据the FAQ from the Phoenix offical site,没有必要汇集Phoenix JDBC Connections。
由于基础HBase连接,Phoenix的Connection对象与大多数其他JDBC Connections不同。 Phoenix Connection对象旨在成为一个创建成本低廉的瘦对象。如果重复使用Phoenix Connections,则前一个用户可能不会始终将基础HBase连接保持在正常状态。最好创建新的Phoenix Connections以确保您避免任何潜在的问题。
实现Phoenix的池可以简单地通过创建委托连接来实现,该连接在从池中检索时实例化新的Phoenix连接,然后在将其返回池时关闭连接(参见PHOENIX-2388)。强>
我认为上面的粗体内容是汇集瘦客户端连接的最佳做法。
您可以尝试在客户端设置以下配置以调整性能,请在Configuration and Tuning查看更多详细信息。
更新:以下是Phoenix连接池的简单工具
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class DataSource {
private String driverClass;
private String jdbcUrl;
private String user;
private String password;
private int min; // The number of connections of initial pool
private int max;
private int used; // The number of connections of polled and not released from poll
private Queue<Connection> pool = null;
public DataSource(String driverClass, String jdbcUrl, String user, String password, int min, int max) {
this.driverClass = driverClass;
this.jdbcUrl = jdbcUrl;
this.user = user;
this.password = password;
this.min = min;
this.max = max;
this.used = 0;
this.pool = new ConcurrentLinkedQueue<Connection>();
init();
}
private void init() {
try {
Class.forName(driverClass);
for (int i = 0; i < min; i++) {
Connection conn = DriverManager.getConnection(jdbcUrl, user, password);
pool.add(conn);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
Connection conn = null;
if (pool.size() > 0) {
conn = pool.poll();
Thread connGen = new Thread(new Runnable() {
@Override
public void run() {
try {
Connection conn = DriverManager.getConnection(jdbcUrl, user, password);
pool.add(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
});
connGen.start();
used ++;
} else if(used < max) {
try {
conn = DriverManager.getConnection(jdbcUrl, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
public void releaseConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
used--;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}