可能重复:
when to close Connection, Statement, PreparedStatement and ResultSet in JDBC
我为JDBC连接编写了一个简单的包装器并且它可以工作,但我希望尽可能地使用最佳实践来改进它。它基本上包含open()
,close()
,isOpened()
,select()
,insert()
,update()
,delete()
和{{1}等方法}}。为简单起见,我将仅在此处发布前4种方法。
batch()
注意:
public class Query{
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
//Database.open() returns a Connection ready to use
public void open (Database database) throws DatabaseException, SQLException{
if (!isOpened ()){
con = database.open ();
}
}
public void close () throws SQLException{
if (isOpened ()){
if (ps != null) ps.close ();
con.close ();
con = null;
}
}
public boolean isOpened (){
return con != null;
}
//The query string is the query without the word "select" and can use placeholders (?)
//The args param it's just an array owith the values of this placeholders
public ResultSet select (String query, Object[] args) throws SQLException{
if (ps != null) ps.close ();
if (isOpened ()){
ps = con.prepareStatement ("select " + query);
if (args != null){
for (int i=0; i<args.length; i++){
ps.setObject (i+1, args[i]);
}
}
rs = ps.executeQuery ();
}
return rs;
}
}
时,所有Connection
和
他们的PreparedStatement
也关闭了,对吗?用法:
ResultSet
你怎么看?我应该在每次查询后关闭并打开连接吗?我可以在同一连接上的每次查询后打开PreparedStatement吗?这是一个很好的设计?
答案 0 :(得分:11)
完成后,您必须关闭PreparedStatement,然后才能在同一连接上创建新的PreparedStatement。我遇到了严重问题,因为我没有关闭PreparedStatements。事实证明,在数据库服务器上,分配的资源仅在显式调用PreparedStatement.close()后才被释放。
正如bdares评论的那样,Connection应尽可能不经常打开和关闭。
答案 1 :(得分:6)
连接池
使用连接池。应用程序中的每个事务都将从此池获得连接,执行所需的所有操作,回滚或提交并关闭连接(它将conn返回到池中)。
您可以为Query对象提供对池的引用,open将获得连接,close将关闭它(实际上将其返回)。
准备好的声明
尝试将已准备好的语句重用于类似查询。这样,数据库将重用以前的查询计划,并且速度会更快。如果您正在执行相同表单的大量查询,那么这很有意义。
如何?
答案 2 :(得分:1)
最佳方法是:对所有查询使用单个Connection对象,如果这些queires是同一方法的一部分,并且每个查询在使用后关闭PreparedStatement。
答案 3 :(得分:1)
使用连接池。所以你不要继续创作。