【问题标题】:Where to define Connection,Statement,ResultSet in a servlet在 servlet 中定义 Connection、Statement、ResultSet 的位置
【发布时间】:2015-11-21 10:23:48
【问题描述】:

我正在使用 BoneCp 连接池。我有一个问题是在哪里指定 JDBC 连接对象,这样它不应该给出像 ResultSet is closed 或 Connection is closed 这样的错误。

我的做法如下图:(code sn-p)

          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  
                }    

           }

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

对于每个请求,都会创建一个新的 servlet 实例,然后我必须如何无误地管理 JDBC 对象。

【问题讨论】:

标签: tomcat servlets jdbc bonecp


【解决方案1】:

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

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

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

这些都应该是本地变量。

【讨论】:

  • 因此仅为 doPost 方法创建实例,而不是为整个 servlet 创建实例。我说的对吗?
  • 在这两种情况下,都会创建一个实例。不同之处在于,如果您使用局部变量,两个线程将不会共享相同的变量,并且不会在彼此的脚趾上工作。因为每个方法调用都有自己的局部变量,不与任何其他方法调用共享。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2014-05-05
    • 2011-08-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2019-06-13
    相关资源
    最近更新 更多