当前位置: 首页 > 面试题库 >

如何正确保持来自JBoss中打开的连接池的数据库连接

陆翔飞
2023-03-14
问题内容

我正在使用JBoss AS 7.1作为服务器,并且我的DataSource配置有缓冲池。我对此很陌生,所以请原谅任何菜鸟错误…毕竟我是来这里学习的。

客户端登录时,它将获得与数据库的连接,我需要保持该连接(从池中)处于打开状态,直到用户注销或HttpSession过期为止。这是来自数据库管理员的绝对要求。谁说他需要
数据库会话变量。 我正在为此使用 servlet

我在尝试各种可能性时遇到了两个主要问题:

  1. 据我所知,JBoss自动关闭未使用的连接=>我打开的连接返回到池中。因此,这可能不是正确的道路。

  2. 如果我尝试像 这样 存储/调用Connection对象

        private Hashtable<String, Connection> connections = new Hashtable<String, Connection>();

    try {
        String strDSName1 = "java:/OracleDSJNDI";
        ctx = new InitialContext();
        ds1 = (javax.sql.DataSource) ctx.lookup(strDSName1);

        System.out.println("Got 1'st ds.");

    } catch (Exception e) {
        System.out.println("ERROR getting 1'st DS : " + e);
    }

    connection = ds1.getConnection();
    connections.put(session.getId(), connection);

    conn = (Connection) connections.get(sessionID);

它将引发此异常:

java.sql.SQLException:连接与托管连接未关联。org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@
dee1f37

我的问题是:如何正确保持连接打开?

谢谢


问题答案:

如何正确保持连接打开?

一定不 要这样做,让连接池来处理。

在后台,连接池将保持与数据库引擎(MySQL,Oracle,SQL Server
…取决于您如何配置)的一系列数据库连接SLEEPING。执行此代码时:

    //avoiding all the particular exceptions just for code simplicity purposes...
    //in real world applications, you must handle each of these exceptions
    public Connection getConnection() throws Exception {
        ctx = new InitialContext();
        ds1 = (javax.sql.DataSource) ctx.lookup(strDSName1);
        return ds1.getConnection();
    }

您要求连接池检索这些可用连接之一。连接池将为您提供数据库连接(如果可用),并允许您随意使用它。然后,您可以在任何需要的地方使用它并 关闭它

    public void foo() throws Exception {
        Connection connection = getConnection();
        //do what you want/need...

        //in the end, you close the connection
        //this is A MUST!
        connection.close();
    }

connection.close()从连接池检索到的连接执行时,您不是在关闭物理数据库连接,而是通知连接池此特定的数据库连接必须返回到SLEEPING状态。

来自解释的一些建议:

  • 一定不要 尝试保持连接活动,这是连接池的工作。
  • 一定不要 尝试将连接存储在任何类似于 缓存 的结构中,这就是连接池的工作。
  • 必须java.sql.Connection在需要的最短范围内检索它。使用完后,将其 关闭


 类似资料:
  • 我遇到了这个问题:对于Vaadin7,我已经配置了我的持久性。xml,下面是代码 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version=“2.0” 当我创建一个新的JPA容器并将其绑定到一个表时,我会在MSSQL活动监视器上看到我的新连接,但如果会话超时或注销,我仍然会在SQL上看到连接。 如果我在应用程序中重新登录,

  • 我正在尝试修复与MySQL数据库的连接问题。几个小时后,我的服务器意外地关闭了与MySQL数据库的连接。 这是我的错误代码: 通用域名格式。mysql。jdbc。例外。jdbc4。CommunicationsException:从服务器成功接收到的最后一个数据包是37521865毫秒前。最后一个成功发送到服务器的数据包是37521865毫秒前。长于服务器配置的“等待超时”值。在应用程序中使用之前,

  • 问题内容: 在许多使用MongoDB的入门示例中,您将看到类似以下的代码: 如果MongoDB与任何其他数据库系统一样,并且操作通常在时间上很昂贵。 所以,我的问题是这样的:只需执行一次,将返回值分配给某个全局模块即可,模块中具有各种功能就可以进行各种与数据库相关的工作(将文档插入集合,更新文档等)。 ),然后由应用程序的其他部分调用它们(从而重新使用该值),然后,在应用程序完成后,才执行。 换句

  • 那么有什么方法可以在JBoss中获得多个用户连接池呢?

  • 我正在为员工管理系统创建一个web应用程序,使用ApacheTomcat作为HTTP服务器,Oracle作为数据库,applet用于客户端编程,servlet用于服务器端编程。我还想使用DBCP来管理与数据库的连接。 我希望执行查询的servlet使用客户端为连接输入的用户名和密码。但是到目前为止,我看到在中配置资源时必须设置连接池的用户名和密码。 有没有什么方法可以实现这一点并且仍然使用DBCP

  • 我有一个使用jHipster创建的Spring Boot应用程序,我正在尝试运行一些集成测试用例,我已经使用以下注释配置了测试用例类: 但我还是得到了上面提到的例外。堆栈跟踪如下所示: