据说在使用后关闭所有JDBC资源是一个好习惯.但是,如果我有以下代码,是否有必要关闭Resultset和Statement?
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = // Retrieve connection
stmt = conn.prepareStatement(// Some SQL);
rs = stmt.executeQuery();
} catch(Exception e) {
// Error Handling
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {};
try { if (stmt != null) stmt.close(); } catch (Exception e) {};
try { if (conn != null) conn.close(); } catch (Exception e) {};
}
Run Code Online (Sandbox Code Playgroud)
问题是连接的关闭是否完成了工作,或者是否使用了一些资源.
我收到了ORA-01000 SQL异常.所以我有一些与之相关的问题.
在循环中执行预准备语句会导致此问题吗?(当然,我本可以使用sqlBatch)注意:一旦循环结束,pStmt就会关闭.
{ //method try starts
String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)";
pStmt = obj.getConnection().prepareStatement(sql);
pStmt.setLong(1, subscriberID);
for (String language : additionalLangs) {
pStmt.setInt(2, Integer.parseInt(language));
pStmt.execute();
}
} //method/try ends
{ //finally starts
pStmt.close()
} //finally ends
Run Code Online (Sandbox Code Playgroud)如果在单个连接对象上多次调用conn.createStatement()和conn.prepareStatement(sql)会发生什么?
Edit1: 6.使用Weak/Soft引用语句对象是否有助于防止泄漏?
Edit2: 1.有什么办法,我可以在项目中找到所有缺少的"statement.close()"吗?我知道这不是内存泄漏.但我需要找一个符合垃圾收集条件的语句引用(不执行close())?有什么工具可用?或者我必须手动分析它?
请帮我理解.
转到ORALCE机器并以sysdba启动sqlplus.
[oracle@db01 ~]$ sqlplus / as sysdba
Run Code Online (Sandbox Code Playgroud)
然后跑
SELECT A.VALUE,
S.USERNAME,
S.SID,
S.SERIAL#
FROM V$SESSTAT A,
V$STATNAME B,
V$SESSION S
WHERE A.STATISTIC# = B.STATISTIC#
AND …Run Code Online (Sandbox Code Playgroud) 它基于我面临的面试问题.
非常简短的定义可以
它可用于操纵查询返回的行.
除了使用光标(分列在这里的MSDN),我在我的脑海的一个问题是,如果我们可以利用执行查询或存储过程中的所有操作(如果我没有错,就像我们可以使用Transact-SQL对于ms-sql),我们应该使用游标吗?
我是Java的新手(我使用的是Java 6).我一直在使用以下设计模式为我的所有Java POJO和servlet通过GlassFish 3.1.2 Web服务器访问Oracle 11G数据库.
当所有可用进程(或会话,不确定区别是什么)被消耗时,我得到间歇性数据库错误(ORA-12519),这导致我以某种方式思考应用程序未发布进程.
查看下面的设计模式,是否有更好的方法可以确保在发生异常时释放与数据库的JDBC连接?例如,我是否还应该将if ( conn != null) conn.close();代码放在catch块中?或者,有更好的设计模式吗?提前感谢任何意见/提示.
public String MyFunction() throws Exception {
Connection conn;
CallableStatement cs;
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call my_sproc (?)}" );
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String outParam = cs.getString(1);
if ( conn != null ) // close connection
conn.close();
} catch (Exception e) {
outParam = "an error occurred";
}
return outparam;
}
Run Code Online (Sandbox Code Playgroud) 如果我不关闭结果集或预备语句会发生什么.
它们是否会被垃圾收集器关闭并释放.
我问这个函数内部的局部变量.
你知道关于这个的任何文件吗?
请考虑以下代码
ResultSet rs = null;
Statement st = null;
try {
//do somehting
} catch (Exception e){
//do something
} finally {
if(st != null){
try {
st.close();
} catch (SQLException e) {
log.error("Exception while closing statement: " + e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当我们关闭语句时,它是否会关闭结果集,或者我们是否需要显式关闭结果集
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
log.error("Exception while closing result set: " + e);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为关闭语句将自动关闭结果集,但如果我没有显式关闭结果集,则FindBugs会抛出以下警告
此方法可能无法清除java.sql.ResultSet