通过 Ruby on Rails 和 oracle-enhanced_adapter 使用 Oracle JDBC 语句缓存

Posted

技术标签:

【中文标题】通过 Ruby on Rails 和 oracle-enhanced_adapter 使用 Oracle JDBC 语句缓存【英文标题】:Use Oracle JDBC statement caching with Ruby on Rails and oracle-enhanced_adapter 【发布时间】:2021-03-18 22:27:50 【问题描述】:

oracle-enhanced_adapter 还不支持 Oracle 的 JDBC 驱动程序系列的 JDBC 语句缓存。 如何确保我的默认 ActiveRecord JDBC 连接使用客户端 JDBC 语句缓存?

【问题讨论】:

【参考方案1】:

要激活 JDBC 语句缓存作为解决方法,请将以下代码放在 RAILS_ROOT/config/initializers 中的 .rb 文件中

# Extend oracle-enhanced_adapter by some missed features
# Peter Ramm, 2020-12-07
require 'active_record/connection_adapters/oracle_enhanced/jdbc_connection'

ActiveRecord::ConnectionAdapters::OracleEnhanced::JDBCConnection.class_eval do
  alias :org_new_connection :new_connection                                     # remember original implementation

  # Number of SQL cursor to keep open in database even if application closes them after each execution
  JDBC_STATEMENT_CACHE_SIZE = 100

  def new_connection(config)
    raw_connection = org_new_connection(config)                                 # call original implementation first
    Rails.logger.debug("..JDBCConnection.new_connection: Check JDBC implicit statement caching")

    # Allow Oracle JDBC driver to cache cursors
    unless raw_connection.getImplicitCachingEnabled
      Rails.logger.debug("..JDBCConnection.new_connection: Activate JDBC implicit statement caching")
      raw_connection.setImplicitCachingEnabled(true)
    end

    # hold up to 100 cursors open
    if raw_connection.getStatementCacheSize != JDBC_STATEMENT_CACHE_SIZE
      Rails.logger.debug("..JDBCConnection.new_connection: Set JDBC implicit statement caching from #raw_connection.getStatementCacheSize to #JDBC_STATEMENT_CACHE_SIZE")
      raw_connection.setStatementCacheSize(JDBC_STATEMENT_CACHE_SIZE)
    end

    raw_connection                                                              # return result of original method
  end
end

【讨论】:

以上是关于通过 Ruby on Rails 和 oracle-enhanced_adapter 使用 Oracle JDBC 语句缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 websockets 在 ruby​​ on rails 和 reactJS 之间发送数据

Ruby-on-Rails:多个 has_many :通过可能吗?

如何在 ruby​​ on rails 中获取控制器和操作列表?

Ubuntu Ruby On Rails安装和配置

Ubuntu Ruby On Rails安装和配置

通过Ruby on Rails和docker构建微服务架构之入门教程