java - 如何从 JBoss 中打开的连接池正确保持数据库连接

标签 java jboss datasource connection-pooling

我使用 JBoss AS 7.1 作为服务器,我的数据源配置了池化。我对此很陌生,所以请原谅任何新手错误...毕竟我是来学习的。

当客户端登录时,它会获得到数据库的连接,我需要保持该连接(来自池)打开,直到用户注销或 HttpSession 过期。这是来 self 们的数据库管理员的绝对要求。谁说他需要 DB session 变量。我正在使用 servlet 来处理这一切。

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

  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: Connection is not associated with a managed connection.org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@dee1f37



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

谢谢

最佳答案

How do I properly keep my connection opened?

不能那样做,让连接池处理。


在后台,连接池将保持一堆与数据库引擎(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() 时,您并没有关闭物理数据库连接,而是通知连接池这个特定的数据库连接必须返回到 sleep 状态。


解释中的一些建议:

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

关于java - 如何从 JBoss 中打开的连接池正确保持数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18749104/

相关文章:

javascript - 开发 Grafana 数据源

Java LDAP 密码验证

java - 并发程序的性能会随着线程的增加而下降吗?

java - 打印包含继承成员的数组?

java - 如何让一个方法接收一个可以是字符串或字符数组的参数?

java - JMS消息生产者不会将消息发送到队列

java - JSP 的文件名包含指令以避免编译它们

eclipse - 增量发布到 JBoss 不会更新 JSP 文件,只会更新 Java 文件。

java - 需要将同一个应用程序部署到多个上下文,每个上下文都有不同的数据库 Tomcat7

java - 当 2 个不同的版本位于 2 个单独的模块中时,JBoss 将不会使用正确模块中的 Oracle DataSource 驱动程序