Почему jruby не закрывает соединения с БД?

#java #oracle #jdbc #jruby

#java #Oracle #jdbc #jruby

Вопрос:

Мои вызовы 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:

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

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

Комментарии:

1. Спасибо, с тех пор я только что вызвал @conn.close () сразу после установления соединения, и это оставляет соединение открытым. Мы думаем, что это может быть какая-то проблема с совместимостью драйверов.