- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR
我有一个 Spring Boot 应用程序,它使用存储在文件系统上的 parquet 文件。为了访问它们,我们使用 Apache Drill。
由于我有多个用户可能访问它们,因此我在 Spring 中设置了一个连接池。
当我使用连接池时,Drill 在执行实际查询之前会以某种方式执行“限制 0”查询,这会影响性能。当我通过从直接连接获得的简单语句运行查询时,不会执行相同的“限制 0”查询。
这似乎与Spring JdbcTemplate 使用PreparedStatements 而不是简单的Statement 有关。
有没有办法摆脱那些“limit 0”查询?
-- 详细信息 --
Spring配置类中的连接池如下所示:
@Bean
@ConfigurationProperties(prefix = "datasource.parquet")
@Qualifier("parquetDataSource")
public DataSource parquetDataSource() {
return DataSourceBuilder.create().build();
}
开发配置文件YML文件中对应的属性为:
datasource:
parquet:
url: jdbc:drill:drillbit=localhost:31010
jdbcUrl: jdbc:drill:drillbit=localhost:31010
jndiName: jdbc/app_parquet
driverClassName: org.apache.drill.jdbc.Driver
maximumPoolSize: 5
initialSize: 1
maxIdle: 10
maxActive: 20
validation-query: SELECT 1 FROM sys.version
test-on-borrow: true
当我使用使用上述 Drill DataSource 创建的 JdbcTemplate 执行查询时,可能会执行 3 个不同的查询:
SELECT 1 FROM sys.version
;SELECT * FROM (<my actual query>) LIMIT 0
;下面是执行代码(parquetJdbcTemplate 是扩展 org.springframework.jdbc.core.JdbcTemplate 的类的实例):
parquetJdbcTemplate.query(sqlQuery, namedParameters,
resultSet -> {
MyResultSet result = new MyResultSet();
while (resultSet.next()) {
// populate the "result" object
}
return result;
});
底部查询是“限制 0”查询,然后在中间有验证查询,在顶部(即使未显示查询)是返回我想要的数据的实际查询。
如您所见,“limit 0”查询的运行时间超过了整个执行时间的 1/3。验证查询很好,因为执行时间可以忽略不计,并且需要检查连接。
事实是,当我通过 Drill 驱动程序使用 Connection 执行相同的查询时(因此,没有池),我只能在 UI 监视器中看到我的实际查询:
public void executeQuery(String myQuery) {
Class.forName("org.apache.drill.jdbc.Driver");
Driver.load();
Connection connection = DriverManager.getConnection("jdbc:drill:drillbit=localhost:31010");
Statement st = connection.createStatement();
ResultSet resultSet = st.executeQuery(myQuery);
while (resultSet.next()) {
// do stuff
}
}
正如您所看到的,总执行时间提高了很多(约 14 秒而不是约 26 秒),只是因为没有执行“limit 0”查询。
据我所知,执行这些“limit 0”查询是为了验证并获取有关 Parquet 文件的底层架构的信息。有没有办法在使用连接池时禁用它们?理想情况下,我仍然希望使用PreparedStatements而不是简单的语句,但如果需要,我可以切换到简单的语句,因为我可以完全控制这些查询(因此,除非有人破解了已部署的工件,否则不可能进行SQL注入(inject))。
最佳答案
你是对的,Drill 执行 limit 0 个事先准备好的语句来获取有关模式的信息。我认为没有办法禁止这种行为。虽然我建议启用默认情况下为 false 的 planner.enable_limit0_optimization
选项,但这可能会限制 0 查询执行速度。速度限制 0 查询的另一种方法是通过 View 使用或直接在查询中使用强制转换显式指示架构。
关于不显示查询,我认为这已在最新的 Drill 版本中修复。
关于java - 使用 Spring 数据源时 Apache Drill "limit 0"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329015/
假设您将 Drill 连接到两个独立的数据库,并且运行一个查询,从每个数据库中提取大量数据,然后进行联接。 Drill 如何处理这个问题而不引发内存不足错误?这是假设您请求的数据超出了 Drill 可
我想一次运行选择 Sql Server 查询。我在嵌入式模式下使用 Drill。 select * from ..; select * from ..; 例子:- select * from SqlS
Apache MetaModel 是一个数据访问框架,它为发现、探索和查询不同类型的数据源提供了一个通用接口(interface)。 Apache Drill 是一种无架构的 SQL 查询引擎,它通过
我在具有 16GB 内存的 ubuntu 机器上本地运行 apacherill 1.0(然后在 1.4 上)。当我使用一个非常大的制表符分隔文件(5200 万行,7GB)并执行 Select dist
我尝试了钻取 JDBC 驱动程序以编程方式进行查询。 代码的有用部分: Connection conn = new Driver().connect("jdbc:drill:zk=local", ge
我想连接到 Drill by Java 应用程序,到目前为止,我一直在尝试使用 JDBC 来完成它,我正在使用 https://github.com/vicenteg/DrillJDBCExample
select distinct filename from dfs.contoso.`folder/CSVs/` > 2021-01.csv > 2021-02.csv > ... 或 select
使用 apache drill 1.2,我们可以查询 RDBMS 数据。在这里查看更多信息:https://drill.apache.org/blog/2015/10/16/drill-1.2-rel
我在嵌入模式下使用drill,除了复制和粘贴之外,我不知道如何保存查询输出。 最佳答案 如果您使用 sqlline,则可以创建一个 CSV 格式的新表,如下所示: use dfs.tmp; alter
我在 ubuntu 14.04 64 机器上下载了 apache-drill-1.2.0。提取 tar.zip 内容,转到 bin 文件夹并运行钻取。 现在我尝试打开:http://localhost
Apache Drill 可以读取 ORC 文件吗? 最佳答案 这个答案是由用户 agirish 在 Apache Drill 邮件列表中发布的。复制到这里是为了对这个社区有用。 Drill can
我正在尝试在 Windows 10 x64(使用 Oracle JVM 1.8.0_131)上以嵌入式模式启动 Apache Drill 1.10。启动命令时 sqlline.bat -u "jdbc
当我打字 $ drillbit.sh start 它向我展示了这个错误: ERROR: Java 1.7 or later is required to run Apache Drill. 虽然我有最
我正在尝试在我们的 Drill (1.6.0) 系统上构建安全性。我设法让安全用户身份验证工作(如文档中所述的 JPam),但模拟似乎不起作用。它似乎通过管理员用户执行和获取,而不管谁通过 ODBC
我在 drill 中有一个这样的对象: {MyFruit: [{name:Mike, age:10},{name:Jacob,age:9},{name:William, age:6}]} 我可以通过以
我有按日期和时间组织的CSV文件,如下所示 logs/YYYY/MM/DD/CSV files... 我已设置Apache Drill在这些CSV文件之上执行SQL查询。由于有很多CSV文件;文件的组
我下载了 Apache Drill v1.8,编辑了 conf/drill-override.conf 以进行以下更改: drill.exec: { cluster-id: "drillbits1
我下载了 Apache Drill v1.8,编辑了 conf/drill-override.conf 以进行以下更改: drill.exec: { cluster-id: "drillbits1
我是 Emacs 新手,完成了 Emacs 和基本的 org-mode 教程。 现在我想安装 org-drill。以下是我在 Emacs 上安装 org-drill 的失败尝试。 来自 http://
下面的命令运行正常。 SELECT TO_TIMESTAMP(`ts`,'yyyyMMddHHmmss') FROM dfs.tmp`/mapr/my.cluster.com/hive/cpf_sal
我是一名优秀的程序员,十分优秀!