0

这是一个非常值得问的问题,因为在互联网上几乎找不到类似的问题。

好的,很多年前在 Gwt 被发明之前,我使用 HttpServlet 编写 Java Web 应用程序并且我经常将 Connection 对象放在 Servlet 中。

    public class JDBCServlet extends HttpServlet {

    private Connection connection;

    public void init(ServletConfig c) throws ServletException {
      //Open the connection here
    }

    public void destroy() {
    //Close the connection here
    }

   public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException { 
      //Use the connection here
      Statement stmt = connection.createStatement();
     ..<do JDBC work>..
   }
   }

但是,现在,随着 Gwt 和 RPC 调用的发明。我使用 eclipse 来开发我的带有 Gwt 前端的 Java webapp。好的,在 Eclipse 的 Server 包中,我有一个名为 Data.java 的类

   private static ConnectionPool connectionPool;
    public static void initConnectionPool() throws UnavailableException{
    try {
        String username="root";
        String password="";
        String url ="jdbc:mysql:.....";
        String driver="com.mysql.jdbc.Driver";
        if(connectionPool==null)
        connectionPool = new ConnectionPool(url, username, password, driver, 5, 2); //initialise 5 Connections & put them into the pull, if all connections were used it will add 2 more connections to the pool.
    }
    catch (Exception e) {
          throw new UnavailableException("Couldn't create connection pool");
    }
    }
    public static void testDB(){
     Connection myCon = null;
     PreparedStatement myPreparedStmt=null;
     try{
         initConnectionPool();
         myCon=connectionPool.getConnection();
         myPreparedStmt=myCon.prepareStatement("select * from table1");
         ResultSet results=myPreparedStmt.executeQuery();
         //do something here
      }

好的,让我们看看这个场景,有 5 个不同的人生活在 5 个不同的国家,他们都同时访问了一个调用 testDB() 方法的网页(但第一个会比其他 4 个稍微早一点打开页面)。

我测试并发现第一个打开页面的人将使系统创建 5 个连接。那么,如果2、3、4、5同时访问同一个页面,则系统不会创建更多的连接(系统会先通过initConnectionPool()方法检查是否有可用的未使用的连接,如果有,那么它将重用它,因为该连接是由第一个用户创建的。

如果第 2、3、4、5 个同时打开该页面,那么他们实际上使用了 5 个未使用的连接中的 4 个,因为第一个完成了所有数据的下载,所以第一个已经释放了它与池的连接。

假设第二次刷新该页面,那么系统将读取 initConnectionPool() 方法,实际上第二次将使用 5 个可用的未使用连接中的 1 个,因为每个人都已经在 testDB() 中下载了数据,所以他们都将连接返回到池中。如果有很多人同时打开该页面,则系统将根据需要将 2 个或更多 Connection 对象添加到池中。

这是我的问题:

在 Gwt RPC 示例中,即使我尝试输入private static Connection connection;public static Connection connection;也不会产生任何影响。所以关键字private or public不会对 JDBC 连接对象的范围产生任何影响?

这意味着:
- 如果我们Connection connection;在 Data 类中放入一个方法,那么只有在页面调用该方法时才会打开该连接。例如,如果有 5 个人打开该页面,那么它将创建 5 次连接。那是对的吗?
- 如果我们Connection connection;在 Data 类中放置一个方法,那么该连接将为任何人打开。如果第一个创建了该连接(并且不关闭它),那么其他人可以重用该连接,因为该连接存在于生命周期中。那是对的吗?

但是,HttpServlet 示例呢?有两种解释(哪种解释是正确的?):
- 每次用户加载页面时,系统都会调用public void init(ServletConfig c)方法来创建新的连接。如果 5 个人同时调用同一个页面,系统会创建 5 个连接怎么办?
- 或者,连接是永久创建的,只创建了 1 个连接。如果 5 个人同时拨打电话,并且如果第 3 个人幸运地先连接,那么其他 4 个人必须排队等候,直到第 3 个人完成。

在 Gwt RPC 示例中,连接已创建且从未关闭。只有当我们关闭应用程序时它才被关闭?

但是我们只有在关闭 tomcat 时才会关闭我们的应用程序。

如果长时间没有人使用连接,那么Mysql是否会通过某种机制使空闲连接自动关闭,或者Mysql仍然永远保持这些空闲连接处于活动状态(例如,我们多年来从未关闭过tomcat和mysql服务器然后这些连接仍然处于活动状态多年来?我在这一点上很困惑。

我希望有人可以帮助我澄清它。

4

1 回答 1

0

GWT RPC 使用从 javax.servlet.http.HTTPServlet 扩展而来的 RemoteServiceServlet。它只是一个普通的 servlet,不同的是您不必自己编写代码,它是生成的。

于 2013-06-24T17:33:20.563 回答