JBoss 数据库连接池
Posted
技术标签:
【中文标题】JBoss 数据库连接池【英文标题】:JBoss Database Connection Pool 【发布时间】:2010-10-23 15:16:39 【问题描述】:我是 jboss 的新手,我被要求将 jboss 连接池机制与现有的 Web 应用程序结合起来。考虑到 Web 应用程序数据库层已正确编写,即所有结果集、语句和连接在不需要时正确关闭,在我正确配置 jboss 数据源后,我必须在我的 Web 应用程序中进行所有代码更改。
谁能指点我在网络应用程序中使用 jboss 数据源的教程或代码示例。
【问题讨论】:
配置 JBoss 是交易的一部分,网上有很多示例和教程。我关心的是代码库中可能需要的更改。有人可以指点我一个示例或教程,在那里我可以看到我们如何从 JBoss darasource 检索连接以及以后应该如何处理它,即关闭或释放连接。谢谢。 【参考方案1】:首先创建一个名为 xxx-ds.xml
的 xml 文件,并将此文件放入 server/default/deploy/xxx-ds.xml
<datasources>
<local-tx-datasource>
<jndi-name>/jdbc/Exp</jndi-name>
<type-mapping>SQL</type-mapping>
<connection-url>jdbc:microsoft:sqlserver:// </connection-url>
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>
<user-name></user-name>
<password></password>
<min-pool-size>5</min-pool-size>
<max-pool-size>1000</max-pool-size>
</local-tx-datasource>
</datasources>
jboss-web.xml
<jboss-web>
<!-- <security-domain flushOnSessionInvalidation="false"/>-->
<!-- <context-root>/BSI</context-root>-->
<resource-ref>
<description>Database connection resource</description>
<res-ref-name>jdbc/Exp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<jndi-name>java:/jdbc/Exp</jndi-name>
<res-auth>Container</res-auth>
</resource-ref>
</jboss-web>
web.xml
<resource-ref>
<description>Database connection resource</description>
<res-ref-name>jdbc/Exp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
现在在您的 .java
文件中
javax.naming.Context ctx1 = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) ctx1.lookup("java:comp/env/jdbc/Exp");
con = ds.getConnection();
*****确保资源引用名称在所有地方都应该相同
【讨论】:
【参考方案2】:JBoss 中的池全部在 DataSource 配置中处理。 Here 是操作指南。 Web 应用程序必须对数据源执行 JNDI 查找以获取数据库连接,而不是执行直接 JDBC URL,然后您将拥有池。
不过,交易是另一回事。
编辑:为了回应您关于这如何影响代码的评论,这就是它的样子:
String jndiPath = "java:DataSourceJNDIName"; //The exact prefix here has a lot to do with clustering, etc., but if you are using one JBoss instance standalone, this works.
Context ctx = new InitialContext();
DataSource ds = (DataSource) PortableRemoteObject.narrow(ctx.lookup(jndiPath), DataSource.class);
Connection c = ds.getConnection();
从技术上讲,PortableRemoteObject.narrow 在 JBoss(无论如何是 4.2.2)单服务器配置中肯定不是必需的,但它是更合适的 J2EE 标准代码,因为一般应用程序服务器不必返回仅用于执行 Context.lookup 的正确类型。
以上内容不包括资源利用和错误处理问题。您应该在完成后关闭该 Context 对象,当然还有数据库连接,尽管如果您忘记关闭数据库连接并且事务结束,JBoss 会对您大喊大叫,并为您关闭它。
无论如何,Connection 对象和 DriverManager.getConnection(url) 一样可用;
【讨论】:
【参考方案3】:您无需更改任何内容。 当您选择正确类型的数据源(local-tx-datasource / xa-datasource)时,连接处理和 TX 将为您完成。在 $JBoss/docs/examples/jca 中,您可以找到几乎所有数据库的模板,您可以重复使用这些模板。
如果您使用的是 XA,则需要配置 Tx-recovery。请参阅此帖子的操作方法: http://management-platform.blogspot.com/2008/11/transaction-recovery-in-jbossas.html(好吧,也许不是独立模式下的操作指南,而是结合 Jopr 源代码)。
【讨论】:
以上是关于JBoss 数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate、Spring 和 c3p0 连接池导致 JBoss 打开过多的数据库连接