#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 () сразу после установления соединения, и это оставляет соединение открытым. Мы думаем, что это может быть какая-то проблема с совместимостью драйверов.