java使用impala存放多条sql_impala jdbc驱动执行impala sql的一个坑(不支持多行sql)...

架构使用spark streaming 消费kafka的数据,并通过impala来插入到kudu中,但是通过对比发现落地到kudu表中的数据比kafka消息数要少,通过后台日志发现,偶发性的出现java.sql.SQLException: [Simba][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: Syntax error in line 1

原因是调用过程中使用了数据库连接池,会合并多行sql执行,实现如下:

importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.pool.DruidDataSourceFactory;importcom.alibaba.druid.pool.DruidPooledConnection;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importjava.sql.SQLException;importjava.util.Properties;

public classImapalConnPool {private static Log logger = LogFactory.getLog(ImapalConnPool.class);private static ImapalConnPool imapalConnPool = null;private static DruidDataSource druidDataSource = null;static{

Properties properties= newProperties();

properties.setProperty("driverClassName","com.cloudera.impala.jdbc41.Driver");

properties.setProperty("url","jdbc:impala://127.0.0.1:21050");

properties.setProperty("username","");

properties.setProperty("password","");

properties.setProperty("initialSize","50");

properties.setProperty("maxActive","100");

properties.setProperty("maxWait","60000");

properties.setProperty("timeBetweenEvictionRunsMillis","60000");

properties.setProperty("minEvictableIdleTimeMillis","300000");

properties.setProperty("validationQuery","SELECT 1");

properties.setProperty("testWhileIdle","true");

properties.setProperty("testOnBorrow","false");

properties.setProperty("testOnReturn","false");

properties.setProperty("poolPreparedStatements","false");//当该值大于0时,启用pool,poolPreparedStatements为true

properties.setProperty("maxPoolPreparedStatementPerConnectionSize","-1");try{

druidDataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); //DruidDataSrouce工厂模式

} catch(Exception e) {

logger.error(e);

}

}public staticImapalConnPool getInstance(){if (null ==imapalConnPool){synchronized(ImapalConnPool.class) {if(null ==imapalConnPool) {

imapalConnPool= newImapalConnPool();

}

}

}returnimapalConnPool;

}public DruidPooledConnection getConnection() throwsSQLException {returndruidDataSource.getConnection();

}

}

调整上述参数poolPreparedStatements和maxPoolPreparedStatementPerConnectionSize任然不能解决同一个connection合并多行sql的问题

后去掉连接池,改为jdbc直连问题解决。有解决过上面数据库连接池问题的麻烦告知我一下

Connection connectionn = null;

Statement statement= null;try{

Class.forName("com.cloudera.impala.jdbc41.Driver");

connectionn= DriverManager.getConnection("jdbc:impala://127.0.0.1:21050");

statement=connectionn.createStatement();for(String item : execSql) {

statement.execute(item);

}

processResult= true;

}catch(Exception ex){

logger.error(this,ex);

}finally{if(null !=statement){try{

statement.close();

}catch(Exception ex){

logger.error(this,ex);

}

}if(null !=connectionn) {try{

connectionn.close();

}catch(Exception ex){

logger.error(this,ex);

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,这个错误信息表明在尝试建立JDBC连接时出现了问题。具体来说,它指出了一个嵌套的SQLException,该异常的原因是无法找到名为“com.cloudera.impala.jdbc.Driver”的驱动程序。这通常是由于缺少相应的JDBC驱动程序或驱动程序未正确配置所致。 解决此问题的步骤如下: 1. 确保已正确安装并配置了所需的JDBC驱动程序。在这种情况下,需要确保已正确安装Cloudera Impala JDBC驱动程序。 2. 确保在代码中正确指定了JDBC驱动程序的位置。这通常涉及到在代码中指定正确的JDBC URL和驱动程序类名。 3. 确保数据库服务器正在运行,并且可以从您的应用程序服务器上的网络访问该服务器。 以下是一个Java代码示例,演示如何建立JDBC连接并执行查询: ```java import java.sql.*; public class JdbcExample { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // Register JDBC driver Class.forName("com.cloudera.impala.jdbc.Driver"); // Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection("jdbc:impala://localhost:21050/default", "<username>", "<password>"); // Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, name, age FROM employees"; rs = stmt.executeQuery(sql); // Extract data from result set while (rs.next()) { // Retrieve by column name int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); // Display values System.out.print("ID: " + id); System.out.print(", Name: " + name); System.out.println(", Age: " + age); } // Clean-up environment rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch (Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // Finally block used to close resources try { if (stmt != null) stmt.close(); } catch (SQLException se2) { } // nothing we can do try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } // end finally try } // end try } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值