Tomcat 在servlet中定义连接、语句和结果集的位置

Tomcat 在servlet中定义连接、语句和结果集的位置,tomcat,servlets,jdbc,bonecp,Tomcat,Servlets,Jdbc,Bonecp,我正在使用BoneCp连接池。我有一个问题,在哪里指定JDBC连接对象,这样它就不会出现诸如ResultSet已关闭或connection已关闭之类的错误 我的工作如下所示:(代码片段) 这是一种好方法,还是我必须在doPost中定义所有JDBC对象 对于每一个请求,都会创建一个新的servlet实例,然后我将如何管理JDBC对象而不出错。不,这根本不是一个好方法 您使用的是实例变量,使用相同的servlet对象来服务到该servlet的所有请求。因此,如果请求1进入,它将打开一个连接并将其分配

我正在使用BoneCp连接池。我有一个问题,在哪里指定JDBC连接对象,这样它就不会出现诸如ResultSet已关闭或connection已关闭之类的错误

我的工作如下所示:(代码片段)

这是一种好方法,还是我必须在
doPost
中定义所有JDBC对象


对于每一个请求,都会创建一个新的servlet实例,然后我将如何管理JDBC对象而不出错。

不,这根本不是一个好方法

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

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


这些都应该是局部变量。

不,这根本不是一个好方法

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

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


这些都应该是本地变量。

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

最好使用singleton连接工厂类来服务连接。
同样在Java8之后,如果您在try(…)中打开conneciton,它会在try块结束后关闭您的连接。

所以实例只为doPost方法创建,而不是为整个servlet创建。对吗?在这两种情况下,都将创建一个实例。不同之处在于,如果使用局部变量,两个线程将不会共享相同的变量,也不会相互作用。因为每个方法调用都有自己的局部变量,不与任何其他方法调用共享,所以只为doPost方法创建实例,而不是为整个servlet创建实例。对吗?在这两种情况下,都将创建一个实例。不同之处在于,如果使用局部变量,两个线程将不会共享相同的变量,也不会相互作用。因为每个方法调用都有自己的局部变量,不与任何其他方法调用共享。Related/duplicate:Related/duplicate:
          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  
                }    

           }