什么是" pool"的正确方法。 Phoenix Query Server连接

时间:2016-02-03 17:26:51

标签: java azure phoenix

我们正在使用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非常不同。我的建议是"阅读说明"您正在使用的产品并按照他们的要求去做!

1 个答案:

答案 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查看更多详细信息。 enter image description here

更新:以下是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();
            }
        }
    }

}