背景
如何在多个不同的数据库之间进行关联查询,获取查询结果目前采用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();
}
}
}