开发者社区> 问答> 正文

日志打印可执行语句时报错

使用druid-1.0.18.jar,配置了日志打印,但是解析时报错了,貌似是不支持在SQL中指定表所属的DB?

另外,我还关心以下两个问题:

报这个错是不是代表我没有用到SQLParser的性能优化?即没有把druid的性能优化用起来?谢谢! 日志会如何打印连接数据库的用户名和密码吗?例如:[C3P0ConnectionProvider:104]: configure() Connection properties: {user=dbuser, password=****} 报错信息: 2017-05-12 12:50:20:147 [WARN] pool-31-thread-9 [SQLUtils:253]: format() format error com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'INTO DataDB..TBL_TEST_7',expect DOTDOT, actual DOTDOT MSODataDB at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:232) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:407) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:145) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:140) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:249) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:241) at com.alibaba.druid.filter.logging.LogFilter.logExecutableSql(LogFilter.java:546) at com.alibaba.druid.filter.logging.LogFilter.statementExecuteBatchAfter(LogFilter.java:471) at com.alibaba.druid.filter.FilterEventAdapter.statement_executeBatch(FilterEventAdapter.java:281) at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2594) at com.alibaba.druid.filter.FilterAdapter.statement_executeBatch(FilterAdapter.java:2474) at com.alibaba.druid.filter.FilterEventAdapter.statement_executeBatch(FilterEventAdapter.java:279) at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2594) at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.executeBatch(StatementProxyImpl.java:192) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeBatch(DruidPooledPreparedStatement.java:559)

2017-05-12 12:50:20:147 [DEBUG] pool-31-thread-9 [Statement:137]: statementLog() {conn-10002, pstmt-20007} executed. INSERT INTO DataDB..TBL_TEST_7 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 2017-05-12 12:50:20:148 [DEBUG] pool-31-thread-9 [Statement:137]: statementLog() {conn-10002, pstmt-20007} batch executed. 86.012686 millis.

原提问者GitHub用户jijianganchu

展开
收起
山海行 2023-07-05 21:00:34 86 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的日志信息,报错信息中显示了com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'INTO DataDB..TBL_TEST_7',expect DOTDOT, actual DOTDOT MSODataDB,提示在SQL语句中存在语法错误。具体来说,这个错误是因为SQL解析器无法正确解析语句中的表名部分。

    根据您的描述,这可能与指定表所属的数据库有关。您提到是否不支持在SQL中指定表所属的数据库。针对这个问题,可以尝试以下解决方法:

    1. 确认数据库连接配置是否正确:检查数据库连接URL、用户名和密码等配置项是否正确,确保可以成功连接到数据库。

    2. 检查SQL语句中的表名部分:确保SQL语句中指定的表名格式正确,包括数据库名和表名之间使用.进行分隔,例如database.table。同时,确保表名不存在多余的.或其他特殊字符。

    3. 版本更新:根据回答中提到的信息,该问题已在新版本中得到修复。您可以尝试升级到最新版本(1.1.14)的druid库,看是否能够解决这个问题。

    至于您的其他问题:

    - 报错信息并不代表是否使用了SQLParser的性能优化。报错信息主要提示了SQL解析过程中的语法错误,并不涉及性能优化的问题。

    - 默认情况下,druid库不会打印连接数据库的用户名和密码到日志中。为了避免密码泄露,通常建议不要将密码记录在日志中。如果您确实需要在日志中记录连接数据库的信息,可以自定义日志输出,在连接数据库时手动记录相应的日志。

    2023-07-30 15:06:39
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    果您在使用日志打印工具记录可执行的SQL语句时,遇到了报错的情况,可能是因为SQL语句中包含了一些特殊字符,如单引号、双引号、反斜杠等,导致日志打印工具无法正确解析和输出SQL语句。

    为了解决这个问题,您可以尝试以下方法:

    使用日志打印工具提供的转义方法。一些日志打印工具提供了转义方法,可以将SQL语句中的特殊字符进行转义,以防止日志打印工具无法正确解析和输出SQL语句。例如,您可以使用log4j的MessageFormat.format()方法来对SQL语句进行转义,例如:

    Copy
    String sql = "SELECT * FROM table WHERE name = '{0}'";
    String formattedSql = MessageFormat.format(sql, "John's");
    logger.info(formattedSql);
    在这个例子中,我们使用了MessageFormat.format()方法来对SQL语句中的单引号进行转义,从而避免了日志打印工具无法正确输出SQL语句的问题。

    使用参数化SQL语句。参数化SQL语句可以将SQL语句和参数分离,以避免SQL注入攻击,并且方便日志打印工具输出可执行的SQL语句。例如,您可以使用PreparedStatement对象来执行参数化SQL语句,并将PreparedStatement对象的toString()方法输出到日志中,例如:

    Copy
    String sql = "SELECT * FROM table WHERE name = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, "John's");
    logger.info(ps.toString());
    在这个例子中,我们使用PreparedStatement对象来执行参数化SQL语句,并将PreparedStatement对象的toString()方法输出到日志中,从而避免了SQL语句中特殊字符的问题,并且方便了日志打印工具输出可执行的SQL语句。

    2023-07-30 13:02:23
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:53:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载