java - 为什么 jruby 不关闭数据库连接?
问题描述
我通过 jruby 调用 Oracle 并没有关闭他们的数据库连接。
以下是调用网页的代码:
<%
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 个打开的会话。由于某种原因,关闭连接的调用并未停止会话。有什么想法可能是错的吗?
解决方案
def close_connection()
@conn.close() unless @conn
end
因为有条件,你真的想要:@conn.close if @conn
推荐阅读
- stata - Stata:根据年度数据减少观察
- c++ - 如果有一种方法可以构造代码以便更容易推理
- hadoop - Hadoop namenode 和辅助 nemenode 概念
- ruby-on-rails - 带有命名空间或预期行为的 ActiveRecord 错误?
- python - Python添加一个循环遍历字段的函数
- android - letterSpacing 和 lineSpacingMultiplier 可以在android的样式文件中声明吗?
- c - 在 SIGSEVG 信号后中断无限循环
- python - 使用字典条目拆分/分解 Pandas 列
- modelica - Dymola中求解非线性系统模型的最大能力是多少?
- sage - Sagemath 作为 python 库