Java 如何正确保持JBoss中打开的连接池中的DB连接

Java 如何正确保持JBoss中打开的连接池中的DB连接,java,jboss,datasource,connection-pooling,Java,Jboss,Datasource,Connection Pooling,我使用JBossAS7.1作为服务器,我的数据源配置了池。我对这个很陌生,所以请原谅任何新手的错误。。。毕竟我是来学习的 当客户端登录时,它会获得到数据库的连接,我需要保持池中的连接处于打开状态,直到用户注销或HttpSession过期。这是来自我们DB管理员的绝对要求。他说他需要DB会话变量。我使用servlet来完成所有这些 利用这些可能性,我遇到了两个主要问题: 在我看来,JBoss会自动关闭未使用的连接=>我打开的连接会返回到池中。所以这可能不是正确的道路 如果我尝试像这样存储/调用连接

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

当客户端登录时,它会获得到数据库的连接,我需要保持池中的连接处于打开状态,直到用户注销或HttpSession过期。这是来自我们DB管理员的绝对要求。他说他需要DB会话变量。我使用servlet来完成所有这些

利用这些可能性,我遇到了两个主要问题:

在我看来,JBoss会自动关闭未使用的连接=>我打开的连接会返回到池中。所以这可能不是正确的道路

如果我尝试像这样存储/调用连接对象:

它抛出以下异常:

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

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

谢谢

如何正确保持连接处于打开状态

您不能这样做,让连接池来处理这个问题

在后台,连接池将保留一组到数据库引擎MySQL、Oracle、SQL Server的数据库连接。。。取决于在睡眠状态下如何配置它。执行此代码时:

//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();
}
您正在请求连接池检索其中一个可用的连接。连接池将为您提供数据库连接(如果可用),并允许您使用它,只要您愿意。然后,您可以在任何需要/需要的地方使用它并关闭它:

从连接池检索的连接执行connection.close时,您并没有关闭物理数据库连接,而是通知连接池此特定数据库连接必须返回睡眠状态

解释中的一些建议:

您不能试图保持连接处于活动状态,这是连接池的工作。 您不能尝试将连接存储在任何类似缓存的结构中,这是连接池的工作。 您必须在需要的最短范围内检索java.sql.Connection。一旦你使用了它,关闭它。 如何正确保持连接处于打开状态

您不能这样做,让连接池来处理这个问题

在后台,连接池将保留一组到数据库引擎MySQL、Oracle、SQL Server的数据库连接。。。取决于在睡眠状态下如何配置它。执行此代码时:

//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();
}
您正在请求连接池检索其中一个可用的连接。连接池将为您提供数据库连接(如果可用),并允许您使用它,只要您愿意。然后,您可以在任何需要/需要的地方使用它并关闭它:

从连接池检索的连接执行connection.close时,您并没有关闭物理数据库连接,而是通知连接池此特定数据库连接必须返回睡眠状态

解释中的一些建议:

您不能试图保持连接处于活动状态,这是连接池的工作。 您不能尝试将连接存储在任何类似缓存的结构中,这是连接池的工作。 您必须在需要的最短范围内检索java.sql.Connection。一旦你使用了它,关闭它。
DBA基本上要求您通过使数据库连接等效于用户的会话来避免连接池

因此,一种选择是不使用连接池,而是围绕用户会话滚动您自己的打开/关闭数据库连接的功能。不过,这似乎既复杂又不同寻常

另一种选择是检查DBA的需求。DBA可能必须适应这样的想法,即他需要以不同的方式跟踪状态,例如,通过使用与会话相关的键将他需要的状态存储在表中,而不是将状态存储在连接层中


一般来说,在某些组件的会话处理中存储状态会增加间接的复杂性,因为您开始关心组件如何处理过期和唯一性,正如您在这里发现的,HTTP会话状态处理此问题的方式与数据库会话不同。

您的DBA基本上要求您通过使数据库连接等效于用户的会话来避免连接池

因此,一种选择是不使用连接池,而是围绕用户会话滚动您自己的打开/关闭数据库连接的功能。不过,这似乎既复杂又不同寻常

另一种选择是检查DBA的需求。DBA可能必须适应这样的想法,即他需要以不同的方式跟踪状态,例如,使用与会话相关的键将他需要的状态存储在表中,而不是将状态存储在表中 连接层


一般来说,在某些组件的会话处理中存储状态会增加间接的复杂性,因为您开始关心组件如何处理过期和唯一性,正如您在这里发现的,HTTP会话状态处理此问题的方式与数据库会话不同。

您可以详细说明为什么需要会话变量吗?保持数据库连接似乎阻碍了连接池的J2ee原则…我知道这是违反J2ee原则的。。。我试图维持我的案子,但是DB管理员。坚持他需要每个客户端连接的会话变量。也许是为了追踪。我真的不理解他。我告诉他会话跟踪应该是服务器应用程序的工作。不是DB。也许你能解释一下为什么需要会话变量吗?保持数据库连接似乎阻碍了连接池的J2ee原则…我知道这是违反J2ee原则的。。。我试图维持我的案子,但是DB管理员。坚持他需要每个客户端连接的会话变量。也许是为了追踪。我真的不理解他。我告诉他会话跟踪应该是服务器应用程序的工作。不是DB。谢谢你的快速回复。如果我理解正确,这意味着DB会话变量只分配给拥有我连接的模式的用户。如果是这种情况,那么我如何为池中的每个连接分配一个数据库SID,因为我认为DB Admin就是这样。需要?@sebster是的,DB会话变量将属于您在数据源中配置的用户。看起来您希望为每个登录用户处理不同的连接凭据,对吗?是的,这是我从DB管理员那里了解到的。他为什么要那样,不知道。他想要的听起来像是某种会话跟踪,但不是DB端。我试图告诉他我可以在服务器端实现会话跟踪机制,但讨论结束时他坚持说他需要这个。“有没有办法实现这一点,或者这是一个荒谬的要求?”塞巴斯特请阅读。如果您的DBA真的坚持要您尝试实现这样的东西,那么您应该与项目管理员或软件架构师或有足够能力向他展示权衡的人交谈,特别是实现这样的东西的高成本,特别是性能问题,通过手动打开或关闭servlet doGet或doPost中的数据库连接并执行1000即可轻松测试此度量可以改变servletGracias Luiggi!上的请求!。。你帮我弄清楚了这件事。我会和项目经理谈谈,看看我们如何管理DBA。干杯谢谢你的快速回复。如果我理解正确,这意味着DB会话变量只分配给拥有我连接的模式的用户。如果是这种情况,那么我如何为池中的每个连接分配一个数据库SID,因为我认为DB Admin就是这样。需要?@sebster是的,DB会话变量将属于您在数据源中配置的用户。看起来您希望为每个登录用户处理不同的连接凭据,对吗?是的,这是我从DB管理员那里了解到的。他为什么要那样,不知道。他想要的听起来像是某种会话跟踪,但不是DB端。我试图告诉他我可以在服务器端实现会话跟踪机制,但讨论结束时他坚持说他需要这个。“有没有办法实现这一点,或者这是一个荒谬的要求?”塞巴斯特请阅读。如果您的DBA真的坚持要您尝试实现这样的东西,那么您应该与项目管理员或软件架构师或有足够能力向他展示权衡的人交谈,特别是实现这样的东西的高成本,特别是性能问题,通过手动打开或关闭servlet doGet或doPost中的数据库连接并执行1000即可轻松测试此度量可以改变servletGracias Luiggi!上的请求!。。你帮我弄清楚了这件事。我会和项目经理谈谈,看看我们如何管理DBA。干杯谢谢你的回答。关于打开/关闭DB conn的功能:如何与JBoss配置的数据源结合使用?因为使用DriverManager获取连接对我来说不太合适。谢谢你的回答。关于打开/关闭DB conn的功能:如何与JBoss配置的数据源结合使用?因为在我看来,使用DriverManager获取连接并不合适。
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();
}