
# 通过HSFabric的用户名密码认证实现查询HetuEngine SQL任务
#### 适用场景
- 支持客户端跨网段访问。
- 只需要确保业务侧和HetuEngine服务端HSFabric所在业务节点网络互通，且对外开放HSFabric固定的IP和端口。
- 适用于双平面的网络场景。
 
#### 功能简介
通过HSFabric连接方式实现，使用用户名和密码连接到HetuEngine，组装对应的SQL发送到HetuEngine执行。
```
public class JDBCExampleFabric {    
    private static Properties properties = new Properties();
    private static void init() throws ClassNotFoundException {
        // 认证用的密码写入代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全;
        // 本示例以密码保存在环境变量中来实现身份验证为例，运行本示例前，请先在本地环境中设置环境变量HETUENGINE_PASSWORD
        properties.setProperty("user", "YourUserName");
        String password = System.getenv("HETUENGINE_PASSWORD");
        properties.setProperty("password",password);
        Class.forName("io.XXX.jdbc.XXXDriver");
    }
    public static void main(String[] args){
        Connection connection = null;
        ResultSet resultSet = null;
        PreparedStatement statement = null;
        String url = "jdbc:XXX://192.168.1.130:29902,192.168.1.131:29902/hive/default?serviceDiscoveryMode=hsfabric";
        try {
            init();
            String sql = "show tables";
            connection = DriverManager.getConnection(url, properties);
            statement = connection.prepareStatement(sql.trim());
            resultSet = statement.executeQuery();
            Integer colNum = resultSet.getMetaData().getColumnCount();
            while (resultSet.next()) {
                for (int i = 1; i <= colNum; i++) {
                    System.out.println(resultSet.getString(i) + "\t");
                }
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```
上述代码中各参数说明如[表1]所示：
 表1参数及参数说明 
| 参数名称     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| url      | jdbc:*XXX* ://*HSFabric1_IP* :*HSFabric1_Port* ,*HSFabric2_IP* :*HSFabric2_Port* ,*HSFabric3_IP* :*HSFabric3_Port* /*catalog* /*schema*?serviceDiscoveryMode=hsfabric 说明： - XXX：驱动名，请以实际样例代码中的内容为准。  - catalog、schema分别是JDBC客户端要连接的catalog和schema名称。  - HSFabric_IP:HSFabric_Port是HSFabric的URL，多个URL以逗号隔开。例如："192.168.81.37:29902,192.168.195.232:29902,192.168.169.84:29902"。 在Manager页面，选择"集群 \> 服务 \> HetuEngine \> 实例"，获取HSFabric所有实例的业务IP；在"配置"页签，搜索"gateway.port"，获取HSFabric的端口号。    |
| user     | 访问HetuEngine的用户名，即在集群中创建的"人机"用户的用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| password | 在集群中创建的"人机"用户的用户密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
