微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

T4CConnection.doDescribeTable() 调用每个插入语句?

如何解决T4CConnection.doDescribeTable() 调用每个插入语句?

在查看我的应用程序的性能时,我注意到对于通过 JPA 创建的每个对象,框架调用 Oracle JDBC 驱动程序 (ojdbc8 19.3.0.0) 中的 T4CConnection.prepareStatement 方法代码通过T4CConnection.doDescribeTable(),即使所有插入都针对同一个表。表描述的检索比真正的插入语句执行时间长约 20%。它可以以某种方式调整吗?你知道每次insert每次都调用表描述的目的是什么,对于schema不经常变化的系统不应该缓存吗?

不幸的是,在框架级别很难提取代码示例。
堆栈是 JPA、Hikari、OJDBC。
一般来说,JPA saveAll 方法调用如下:

  • com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement
  • com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate

来自 Hikari 的 PrepareStatement 在内部调用一个驱动程序类,在我的例子中它是:oracle.jdbc.driver.PhysicalConnection.prepareStatement() 找不到确切的源代码,但主要概念与此处相同 https://github.com/mikesmithjr/ora-jdbc-source/blob/master/OracleJDBC/src/oracle/jdbc/driver/PhysicalConnection.java

简化代码

public PreparedStatement prepareStatement(String sql,String[] columnNames) throws sqlException {
        (...) //check if insert statment
        AutoKeyInfo info = new AutoKeyInfo(sql,columnNames);

        doDescribeTable(info); <-- table describe occurs here,pretty slow

        OraclePreparedStatement pstmt = (OraclePreparedStatement) prepareStatement(newsql); <-- in prepareStatement i can benefot from the cache

        return pstmt;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。