1. 絮絮叨叨
-
作为基于内存的、MPP架构的大数据查询引擎,presto支持多种数据源、无需自己的存储
-
很多报表系统,会使用presto做查询引擎,加速查询
-
公司自建的报表系统,一般都是基于Spring的Java Web系统,并使用数据库连接池访问presto
-
业务基于c3p0数据库连接池,实现mybatis访问pressto,出现了一个固定的、执行时间较长的探活SQL
SELECT TABLE_CAT, TABLE_SCHEM, TABLE_NAME, TABLE_TYPE, REMARKS, TYPE_CAT, TYPE_SCHEM, TYPE_NAME, SELF_REFERENCING_COL_NAME, REF_GENERATION FROM system.jdbc.tables WHERE TABLE_NAME LIKE 'PROBABLYNOT' ESCAPE '\' AND TABLE_TYPE IN ('TABLE') ORDER BY TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, TABLE_NAME
-
这个探活SQL需要执行10s以上,而在1s左右系统就会取消查询,因而出现
USER_CANCELED
错误 -
这样的探活SQL,在presto集群中属于失败查询,最终将影响集群的查询成功率
-
因此,需要自定义探活SQL,如
select 1
解决该问题
2. mybatis基于c3p0连接池访问presto
-
通过查看博客:Spring + MyBatis中常用的数据库连接池配置总结,确定业务使用的是c3p0连接池
-
基于
PROBABLYNOT
表的查询,也是c3p0连接池的SQL -
原始的配置如下:
<database singleton="true" logicName="pestoDatabase"> <properties> <property name="jdbcUrl" value="${presto.database.url}"/> <property name="driverClass" value="${presto.database.driverClassName}"/> <property name="user" value="${presto.database.username}"/> </properties> </database>
-
通过设置
preferredTestQuery
属性,将探活SQL设置为select 1
<database singleton="true" logicName="pestoDatabase"> <properties> <property name="jdbcUrl" value="${presto.database.url}"/> <property name="driverClass" value="${presto.database.driverClassName}"/> <property name="user" value="${presto.database.username}" encrypt="false"/> <property name="preferredTestQuery" value="SELECT 1"/> </properties> </database>
-
参考文档: