2015-08-27 24 views
1

我正在使用BoneCp连接池。我有一个问题,即在哪里指定JDBC连接对象,以便它不应该给ResultSet关闭或Connection关闭等错误。在哪里定义servlet中的Connection,Statement,ResultSet

我做的,如下图所示:(代码段)

  public Class GetTable extends HttpServlet { 
       Connection con = null;       
       Statement stmt = null; 
       ResultSet rs = null; 
      protected void doPost(HttpServletRequest req,HttpServletResponse res) 
       { 
       con = ConnectionManager.getConnectionPool().getConnection();  
       //initializing stmt,rs 
       //close con,stmt,rs using try and catch 
       }  

      } 

这是很好的方式,或者有定义所有JDBC里面doPost对象?

对于每个请求创建一个新的servlet实例,那么我如何管理JDBC对象没有错误。

+0

相关/重复:http://stackoverflow.com/q/3106452 – BalusC

回答

0

不,这不是一个好方法。

您正在使用实例变量,并且使用相同的servlet对象来提供所有到该servlet的请求。因此,如果请求1进入,它将打开一个连接并将其分配给实例变量conn

同时,请求2进来,并且因此也将打开连接并将其分配给相同的conn变量。请求1将因此开始使用为请求2打开的连接。当请求1结束时,它将(希望)关闭连接,这将因此也关闭请求2使用的连接。

这些全部应该是本地变量。

+0

因此,实例仅为doPost方法创建,而不是整个servlet。我对吗? –

+0

在这两种情况下,都会创建一个实例。不同之处在于,如果使用局部变量,两个线程将不会共享相同的变量,并且不会在彼此的脚趾上工作。因为每个方法调用都有自己的局部变量,所以不会与任何其他方法调用共享。 –

0

最好使用单例连接工厂类来服务连接。 而且在java 8之后,如果你打开conneciton里面的try(...)它会在try块结束后关闭你的连接。