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

我正在使用JBoss AS 7.1作为服务器,我的DataSource配置了池。 我对此很陌生,所以请原谅任何新手的错误…毕竟我在这里学习。

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

玩我遇到的两个主要问题:

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

  2. 如果我尝试存储/调用Connection对象,如下所示:

    private Hashtable connections = new Hashtable(); 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); 

    它引发了这个exception:

    java.sql.SQLException:Connection与托管connection.org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@dee1f37无关

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

谢谢

如何正确保持连接打开?

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


在幕后,连接池将在SLEEPING状态下保持与数据库引擎(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(); } 

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

 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 。 使用它后, 关闭它。

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

因此,一种选择是不使用连接池,而是滚动自己的function,打开/关闭用户会话周围的数据库连接。 这似乎很复杂和不寻常。

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

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