一位同事从未听说过这一点,我无法提供真正的定义.对我来说,它总是一个'我知道 - 当我看到它'的例子.
奖金问题,谁来源于这个词?
我有点困惑,我正在阅读以下http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Run Code Online (Sandbox Code Playgroud)
你不需要关闭连接吗?如果没有发生conn.close(),会发生什么?
我有一个私人网络应用程序,我正在维护,目前没有关闭任何一种形式,但重要的是真正的stmt one,conn one或者两者兼而有之?
该网站间歇性地停止,但服务器一直说这是一个数据库连接问题,我怀疑它没有关闭,但我不知道哪个关闭.
我收到了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) 我一直在对我们的宠物项目之一进行代码审查(主要使用像FindBugs这样的工具),FindBugs将以下代码标记为错误(伪代码):
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
错误是此代码可能不会释放资源.我发现ResultSet和Statement没有关闭,所以我最后关闭了它们:
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
但是我在很多项目中遇到过上述模式(来自不少公司),没有人关闭ResultSet或Statements.
在Connection关闭时,您是否遇到没有关闭ResultSet和Statements的麻烦?
我发现只有这个,它指的是Oracle在关闭Connections时关闭ResultSet的问题(我们使用Oracle db,因此我的更正).java.sql.api在Connection.close()javadoc中什么也没说.
关于JDBC编码的几个问题:
我知道对close()的调用会释放资源.但是如果我们知道我们稍后会使用它,为什么要释放它然后再请求它呢?
多客户端应用程序怎么样?我们需要连接池,所以我们每次都需要创建和关闭Connection,Statement和PreparedStatement?
谢谢,
我有一个网站,获得了大量的点击,我遇到了问题,JDCB连接错误.
我对关闭有点困惑PreparedStatement,我需要关闭PreparedStatement还是只关闭Statement才关闭.
那么ResultSet,我需要关闭它吗?
我知道Java中的安全模式是在finally块中按顺序关闭ResultSet,Statement和Connection.
如果你关闭连接然后尝试关闭语句(不抛出异常).但是,如果您尝试从语句中调用任何方法,则会抛出异常.
我想知道关闭连接会自动关闭从该连接创建的所有语句对象吗?
更新:
我正在使用DatabaseProductVersion:Oracle Database 11g 11.1.0.0.0版
DriverName:Oracle JDBC驱动程序
DriverVersion:10.2.0.4.0
示例代码:
aStmt = aConn.prepareStatement(aQuery);
aRset = aStmt.executeQuery(cQuery);
while (cRset.next()) {
//stuff to determine value of parm1
aStmt.setString(1, parm1);
aRset = aStmt.executeQuery();
//more stuff
}
Run Code Online (Sandbox Code Playgroud)
在while语句中的每个循环之后,我是否必须关闭aStmt和aRset?或者将在后续循环中重用它们释放从先前循环中使用的内存/资源?
以下站点显示了使用JDBC的新"AutoClosable"功能:link.此站点显示了语句将如何自动关闭,但结果集不在try()部分中,它将自动关闭.所以,我的问题是,我不需要直接在Java 7中关闭ResultSet吗?我一直使用模式:close resultset,close语句,close连接.
我正在使用Spring JDBCTemplate访问数据库中的数据,并且其工作正常.但FindBugs在我的代码片段中指出了一个小问题.
码:
public String createUser(final User user) {
try {
final String insertQuery = "insert into user (id, username, firstname, lastname) values (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(insertQuery, new String[] { "id" });
ps.setInt(1, user.getUserId());
ps.setString(2, user.getUserName());
ps.setString(3, user.getFirstName());
ps.setInt(4, user.getLastName());
return ps;
}
}, keyHolder);
int userId = keyHolder.getKey().intValue();
return "user created successfully with user id: " + userId;
} catch …Run Code Online (Sandbox Code Playgroud) java ×9
jdbc ×6
findbugs ×2
resultset ×2
boilerplate ×1
connection ×1
database ×1
definition ×1
jdbctemplate ×1
spring ×1
terminology ×1