【问题标题】:Error using JNDI datasouce on JBoss 7 for MySQL在 JBoss 7 for MySQL 上使用 JNDI 数据源时出错
【发布时间】:2012-07-09 02:10:48
【问题描述】:

我关注了these instructions

我想在 JBoss 上使用 JNDI 数据源连接 MySQL 数据库以检索一些数据。

一运行 test.jsp 就会产生错误:

javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver found for java:/jdbc/bookstore"
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
    org.apache.jsp.test_jsp._jspService(test_jsp.java:90)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

这是我得到的:

MySQL 服务器 5.5: 数据库 -> 书店 表 -> 书

connector -> mysql-connector-java-5.1.21-bin.jar
container -> jboss-as-7.1.1.Final
IDE -> Eclipse juno

第 1 步 - JBoss:

[JBoss_Home]/modules/com/mysql/main -> 得到下面的文件

module.xml
mysql-connector-java-5.1.21-bin.jar
mysql-connector-java-5.1.21-bin.jar -> this auto created

module.xml 包含:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.21-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
  </dependencies>
</module>

第 2 步 JBoss:

[JBoss_Home]/standalone/configuration/standalone.xml

standalone.xml添加数据源如下:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                <datasource jta="true" jndi-name="java:/jdbc/bookstore" pool-name="bookstore_pool" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>jdbc:mysql://localhost:3306/bookstore</connection-url>
                    <driver>mysql</driver>
                    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>root</user-name>
                        <password>786</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
                </datasource>
                <drivers>
                    <driver name="mysql" module="com.mysql">
                        <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
                    </driver>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

第 3 步 - Eclipse 项目:

test.jsp 页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>


<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="java:/jdbc/bookstore">
select title,description from book
</sql:query>

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>

  <h2>Results</h2>

<c:forEach var="row" items="${rs.rows}">
    Foo ${row.title}<br/>
    Bar ${row.description}<br/>
</c:forEach>

  </body>
</html>

添加web.xml:

<!-- JDBC DataSources (java:comp/env/jdbc) -->
    <resource-ref>
        <description>The used datasource</description>
        <res-ref-name>jdbc/bookstore</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

jboss-web.xml 包含:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <resource-ref>
        <res-ref-name>jdbc/bookstore</res-ref-name>
        <jndi-name>java:/jdbc/bookstore</jndi-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</jboss-web>

以下是项目结构:

【问题讨论】:

  • 你是否也在你的项目中添加mysql.jar?
  • @thinksteep ,是的,我已经在 WEB-INF/lib 中删除了 mysql 连接器,并将其添加为库中的外部 Jar 文件。请参阅上面的屏幕截图。

标签: jakarta-ee jboss datasource jndi


【解决方案1】:

这在 7.1.1.Final 上对我有用,没有任何问题。这是我的设置的样子。

${JBOSS_HOME}/modules/com/mysql/main/modules.xml:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
      <resource-root path="mysql-connector-java-5.1.21-bin.jar"/>
  </resources>
  <dependencies>
      <module name="javax.api" />
  </dependencies>
</module>

standalone.xml

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
    <datasources>
        <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
            <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
            <driver>h2</driver>
            <security>
                <user-name>sa</user-name>
                <password>sa</password>
            </security>
        </datasource>
        <datasource jta="true" jndi-name="java:/jdbc/test" pool-name="test_pool" enabled="true" use-java-context="true" use-ccm="true">
            <connection-url>jdbc:mysql://localhost:3306/as7test</connection-url>
            <driver>mysql</driver>
            <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
            <pool>
                <min-pool-size>10</min-pool-size>
                <max-pool-size>100</max-pool-size>
                <prefill>true</prefill>
            </pool>
            <security>
                <user-name>user</user-name>
                <password>mypass</password>
            </security>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </datasource>
        <drivers>
            <driver name="mysql" module="com.mysql">
                <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
            </driver>
            <driver name="h2" module="com.h2database.h2">
                <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
</subsystem>

这对我有用,没有错误。我没有尝试通过任何代码建立连接,但我确实在 Web 管理控制台上测试了连接。

编辑: 尝试将&lt;module name="javax.transaction"/&gt; 添加到您的依赖项中。有一个错误,默认情况下未添加,我看到您使用的是 XA 数据源。

【讨论】:

  • @james-r-perkins,检查仍然无法正常工作。我认为错误与驱动程序有关。错误我得到“java.sql.SQLException:找不到合适的驱动程序:(
  • 嗯.. ..不确定它可能是什么。我没有安装 MySQL,但也许我应该设置一个 VM 来测试。您可以尝试添加非 xa 驱动程序。可能会发生这种情况。
  • @james-r-perkins,还是那个该死的错误。我照原样复制并粘贴了您所说的内容。
  • 您是否向应用程序的MANIFEST.MF 添加了依赖项?只需添加Dependencies: com.mysql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2012-12-19
  • 2012-05-29
  • 2014-10-05
  • 2011-12-07
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多