Почему Джруби не закрывает соединения БД? - PullRequest
1 голос
/ 12 марта 2019

Мои звонки в Oracle через jruby не закрывают их соединения с БД.

Вот код с веб-страницы, выполняющей вызов:

<%
require 'jdbc_ssl_connection'

# Database settings
url    = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=**REMOVED**)(PORT=**REMOVED**))(CONNECT_DATA=(SERVICE_NAME=**REMOVED**)))"
output = ""
select_stmt, rest, select_sql = nil
begin
  conn = OracleConnection.create(url)
  # Display connection using the to_s method of OracleConnection 
  select_sql = "select FIELD from SCHEMA.TABLE WHERE FIELD='"+@subject["file-name"].first+"'"
  select_stmt = conn.create_statement
  rset = select_stmt.execute_query select_sql
  while (rset.next)
    output = output + rset.getString(1)
  end

rescue
  error = "Error:", $!, "\n"

  ensure
   if (!select_stmt.nil?)
    select_stmt.close
   end
   if (!rset.nil?)
    rset.close
   end
   if (!conn.nil?)
   conn.close_connection
   end
end
%>

Вот класс, взаимодействующий с драйвером.

# jdbc_ssl_connection.rb

require 'java'

java_import 'oracle.jdbc.OracleDriver'
java_import 'java.sql.DriverManager'
java_import 'java.util.Properties'

class OracleConnection

  @conn = nil

  def initialize (url)
    @url = url
    properties = java.util.Properties.new
    properties['user'] = 'REMOVED'
    properties['password'] = 'REMOVED'

    # Load driver class
    oradriver = OracleDriver.new
   DriverManager.registerDriver oradriver
    @conn = DriverManager.get_connection url, properties
    @conn.auto_commit = false

  end

  # Add getters and setters for all attributes we wish to expose
  attr_reader :url, :connection

  def close_connection()
    @conn.close() unless @conn
  end

  def prepare_call(call)
    @conn.prepare_call call
  end

  def create_statement()
    @conn.create_statement
  end

  def prepare_statement(sql)
    @conn.prepare_statement sql
  end

  def commit()
    @conn.commit
  end

  def self.create(url)
    conn = new(url)
  end

  def to_s
    "OracleConnection [url=#{@url}]"
  end
  alias_method :to_string, :to_s

end

Код работает и работаетдовольно простоЯ провел тест, и у меня есть около 100 открытых сессий на БД.По какой-то причине вызов для закрытия соединения не останавливает сеанс.Есть идеи, что может быть не так?

1 Ответ

1 голос
/ 21 марта 2019
  def close_connection()
    @conn.close() unless @conn
  end

из-за условного, вы действительно хотели: @conn.close if @conn

...