如何在JBoss中打开的连接池中正确保持数据库连接
我正在使用JBoss AS 7.1作为服务器,我的DataSource配置了池。 我对此很陌生,所以请原谅任何新手的错误…毕竟我在这里学习。
当客户端登录时,它会获得与数据库的连接,并且我需要保持该连接(从池中)打开,直到用户注销或HttpSession到期。 这是来自我们的数据库管理员的绝对要求。 谁说他需要DB会话变量。 我正在使用servlet来完成这一切。
玩我遇到的两个主要问题:
-
据我所知,JBoss会自动关闭未使用的连接=>我打开的连接返回到池中。 所以这可能不是正确的道路。
-
如果我尝试存储/调用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会话状态处理这与数据库会话不同的地方。
- 如何将PostgreSQL数据源添加到WildFly 9.0?
- 用于MS SQL Server的JBoss AS 5数据库连接池重新连接例程
- 如何将JRBeanCollectionDataSource传递给iReport?
- Out容器JNDI数据源
- spring – 如何自动连接数据源?
- java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver:我加载了正确的驱动程序吗?
- 防止JBoss 7上的JNDI数据源的Oracle连接自动提交(Jeeves DBMS)
- 我应该在应用程序或应用程序服务器中定义数据源吗?
- 无法通过JBoss远程访问数据源