gpt4 book ai didi

java - JDBC 连接对象的范围是什么?它与 HttpServlet 和 GWT RPC 中的连接池方法有何关系?

转载 作者:行者123 更新时间:2023-11-30 01:32:38 27 4
gpt4 key购买 nike

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

好吧,很多年前,在 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 Web 应用程序。好的,在 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 个不同的国家,同时访问一个网页(但第一个会比其他 4 个稍早打开页面)调用 testDB() 方法。

我测试发现第一个打开页面的人会让系统创建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 或 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仍然保持这些空闲连接永远处于 Activity 状态(例如,我们多年来从未关闭过tomcat和mysql服务器,那么这些多年以来的联系仍然活跃吗?我现在很困惑。

希望有人能帮我解释一下。

最佳答案

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

关于java - JDBC 连接对象的范围是什么?它与 HttpServlet 和 GWT RPC 中的连接池方法有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com