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 数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

项目经验——jboss 配置数据库连接池

为 JBoss 中的连接池配置 MongoDB 数据源

Hibernate、Spring 和 c3p0 连接池导致 JBoss 打开过多的数据库连接

总结jboss控制台,得出一下结论(数据库连接池相关)

JBOSS连接池默认连接数是多少?在哪个配置文件有这个默认的连接数?

jboss/wildfly 中的缓存连接管理器