trino环境搭建 项目使用

背景

如何在多个不同的数据库之间进行关联查询,获取查询结果目前采用trino做为技术方案,当前版本2024/6/23不保证后续版本是否会发生变化

1. 通过docker命令安装

docker run -it -d -p 8080:8080 --name trino trinodb/trino

2. 安装pgsql跟mysql用来测试trino查询

docker run --name some-mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
docker run --name some-postgres -e POSTGRES_PASSWORD=123456 -d postgres:13

3 .进入容器

docker exec -it /bin/bash 8368aaa448c5

4. 进入/etc/trino/catalog文件夹进行mysql数据源的配置,其他数据源配置方式也在这个位置具体参考官网

5 .创建一个mysql的文件配置如上图所示

6. 重启trino docker容器打开http://localhost:8080,这里需要设置一个用户名用来连接trino

7.这里用Idea来连接trino成功的话能看到我们配置好的pgsql跟mysql的数据源,这里分别在pgsql跟mysql创建了两张表,用来做关联查询。

8.通过跨库关联查询获取了以下结果。需要注意mysql第一个是trino创建的名称加库名加表名,其他参考官方。以下证明跨库连接成功。

9. java连接trino并进行关联查询 添加pom依赖

        <dependency>
            <groupId>io.trino</groupId>
            <artifactId>trino-jdbc</artifactId>
            <version>450</version>
        </dependency>

10. 运行java测试代码打印获取打印列表

package com.ffcs.ffxtc;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        // Trino连接URL,根据你的Trino配置进行修改
        String url = "jdbc:trino://localhost:8080/catalog";
        // 用于连接Trino的用户名
        String user = "admin";
        // 查询语句
        String query = "SELECT * FROM mysql.mysqltest.test a " +
                "LEFT JOIN postgresql.\"public\".demo b ON a.id = b.id";

        try {
            // 加载Trino JDBC驱动
            Class.forName("io.trino.jdbc.TrinoDriver");
            // 建立连接
            Connection connection = DriverManager.getConnection(url, user, null);
            // 创建Statement对象
            Statement statement = connection.createStatement();
            // 执行查询
            ResultSet resultSet = statement.executeQuery(query);
            // 获取结果集元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 获取列的数量
            int columnCount = metaData.getColumnCount();

            // 遍历每一行数据
            while (resultSet.next()) {
                // 遍历每一列
                for (int i = 1; i <= columnCount; i++) {
                    // 获取列名
                    String columnName = metaData.getColumnName(i);
                    // 获取该列的值
                    String value = resultSet.getString(i);
                    // 打印列名和对应的值
                    System.out.println(columnName + ": " + value);
                }
                System.out.println("-------------------------------");
            }

            // 关闭连接
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

11. 打开localhost:8080 ui可看到执行的状态

12 .如何设置账号密码登录

第一步需要生成一个能登录的账号跟密码

# 安装密码生成器
yum -y install httpd

# 指定一个用户名然后提示创建密码
htpasswd -B -C 10 password.db test

13. 进入容器修改/etc/trino/config.properties 增加配置

# 设置需要密码
http-server.authentication.type=PASSWORD

# 允许通过nginx转发当前地址
http-server.process-forwarded=true

14. /etc/trino/目录下创建一个文件password-authenticator.properties,把刚刚生成的password.db放/etc/trino/password.db

password-authenticator.name=file
file.password-file=/etc/trino/password.db

15. 重启trino容器打开页面,接下来你需要一个nginx服务器,用来转发本地址http://127.0.0.1:8080,这是本人阿里云购买的域名转发了http://127.0.0.1:8080然后输入账号密码就可登录了

16. 地址改成nginx转发地址 trino.vs-chat-zzx.top:443就能连接,这样是目前官网推荐的方式

package com.ffcs.ffxtc;

import java.sql.*;

public class Test {
    public static void main(String[] args) {
        // Trino连接URL,根据你的Trino配置进行修改
        String url = "jdbc:trino://trino.vs-chat-zzx.top:443";
        // 用于连接Trino的用户名
        String user = "admin";
        // 密码
        String password = "zx8257686";

        // 查询语句
        String query = "SELECT * FROM mysql.mysqltest.test a " +
                "LEFT JOIN postgresql.\"public\".demo b ON a.id = b.id";

        try {
            // 加载Trino JDBC驱动
            Class.forName("io.trino.jdbc.TrinoDriver");
            // 建立连接
            Connection connection = DriverManager.getConnection(url, user, password);
            // 创建Statement对象
            Statement statement = connection.createStatement();
            // 执行查询
            ResultSet resultSet = statement.executeQuery(query);
            // 获取结果集元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 获取列的数量
            int columnCount = metaData.getColumnCount();

            // 遍历每一行数据
            while (resultSet.next()) {
                // 遍历每一列
                for (int i = 1; i <= columnCount; i++) {
                    // 获取列名
                    String columnName = metaData.getColumnName(i);
                    // 获取该列的值
                    String value = resultSet.getString(i);
                    // 打印列名和对应的值
                    System.out.println(columnName + ": " + value);
                }
                System.out.println("-------------------------------");
            }

            // 关闭连接
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值