好的做法:JDBC连接

时间:2011-09-02 08:17:01

标签: java jdbc

  

可能重复:
  when to close Connection, Statement, PreparedStatement and ResultSet in JDBC

我为JDBC连接编写了一个简单的包装器并且它可以工作,但我希望尽可能地使用最佳实践来改进它。它基本上包含open()close()isOpened()select()insert()update()delete()和{{1}等方法}}。为简单起见,我将仅在此处发布前4种方法。

batch()

注意:

  • 可以重复使用相同的查询对象,例如打开和关闭 它,再次开放后。
  • 我没有关闭每个查询的连接,我只是关闭 准备好的陈述(这是正确的,或者我可以留下准备好的 语句打开是因为Connection对象会关闭它吗?)
  • 当我关闭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吗?这是一个很好的设计?

4 个答案:

答案 0 :(得分:11)

完成后,您必须关闭PreparedStatement,然后才能在同一连接上创建新的PreparedStatement。我遇到了严重问题,因为我没有关闭PreparedStatements。事实证明,在数据库服务器上,分配的资源仅在显式调用PreparedStatement.close()后才被释放。

正如bdares评论的那样,Connection应尽可能不经常打开和关闭。

答案 1 :(得分:6)

连接池

使用连接池。应用程序中的每个事务都将从此池获得连接,执行所需的所有操作,回滚或提交并关闭连接(它将conn返回到池中)。

您可以为Query对象提供对池的引用,open将获得连接,close将关闭它(实际上将其返回)。

准备好的声明

尝试将已准备好的语句重用于类似查询。这样,数据库将重用以前的查询计划,并且速度会更快。如果您正在执行相同表单的大量查询,那么这很有意义。

如何?

  • 维持最后PS开放
  • 如果您关闭连接或其他什么,请将其关闭
  • 如果查询的查询字符串与之前重新使用的PS相同,则重新使用您保存的PS
  • 如果它不是相同的查询字符串...关闭它并创建一个新的

答案 2 :(得分:1)

最佳方法是:对所有查询使用单个Connection对象,如果这些queires是同一方法的一部分,并且每个查询在使用后关闭PreparedStatement。

答案 3 :(得分:1)

使用连接池。所以你不要继续创作。