使用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
根据您提供的日志信息,报错信息中显示了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库不会打印连接数据库的用户名和密码到日志中。为了避免密码泄露,通常建议不要将密码记录在日志中。如果您确实需要在日志中记录连接数据库的信息,可以自定义日志输出,在连接数据库时手动记录相应的日志。
果您在使用日志打印工具记录可执行的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语句。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。