【问题标题】:Why isn't a jdbc connection pool created?为什么没有创建 jdbc 连接池?
【发布时间】:2016-03-19 07:33:02
【问题描述】:

我正在开发一个带有 EAR 文件的简单 Java EE 应用程序,其中包括 JAR 和 WAR 文件。在 EarContent/META-INF 下的 EAR 项目中,我有以下 glassfish-resources.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool name="java:app/jdbc/test" res-type="javax.sql.XADataSource" datasource-classname="org.apache.derby.jdbc.ClientXADataSource">
        <property name="serverName" value="localhost"/>
        <property name="portNumber" value="1527"/>
        <property name="databaseName" value="test"/>
        <property name="createDatabase" value="create"/>
        <property name="user" value="APP"/>
        <property name="password" value="APP"/>
    </jdbc-connection-pool>
    <jdbc-resource jndi-name="java:app/jdbc/test" pool-name="java:app/jdbc/test"/>
</resources>

在 META-INF 下的 EJB 项目中,我有以下 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="events" transaction-type="JTA">
        <description>Manages events, users and comments</description>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>java:app/jdbc/test</jta-data-source>
        <class>com.hank.entity.Question</class>
        <class>com.hank.entity.QuizWalk</class>
        <class>com.hank.entity.User</class>
        <class>com.hank.entity.QuizWalkParticipants</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            <property name="eclipselink.logging.connection" value="false"/>
            <property name="eclipselink.logging.level.sql" value="ALL"/>
            <property name="eclipselink.logging.parameters" value="true"/>
            <property name="eclipselink.logging.session" value="false"/>
            <property name="eclipselink.logging.thread" value="false"/>
            <property name="eclipselink.logging.timestamp" value="false"/>
        </properties>
    </persistence-unit>
</persistence>

我有一个正在运行的 Derby 服务器,并且端口号是正确的。该应用程序正在工作,只是没有创建数据库。有什么问题?这种方法适用于 Glassfish 3.1。

汉克

【问题讨论】:

  • 你能发布你的堆栈跟踪吗?
  • 我没有收到任何错误消息,因此没有堆栈跟踪。

标签: java jakarta-ee jdbc glassfish


【解决方案1】:

一个月前,我遇到了类似的问题。最后,我的 XML 中有以下状态(与您的相比):

glassfish-resources.xml

  • 我将URLdriverClass 属性添加到glassfish-resources.xml
  • 不确定是否必须这样做,但我有不同的值 jndi-namepool-name
  • 我使用了 mysql,所以我的jdbc-connection-pool 标签具有以下两个属性: res-type="javax.sql.DataSource",
    datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
  • 没有createDatabase 属性

编辑:这是我的 glassfish 资源(它实际上是由 netbeans 自动生成的,我只是添加了正确的凭据和资源名称)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool allow-non-component-callers="false" 
    associate-with-thread="false" 
    connection-creation-retry-attempts="0" 
    connection-creation-retry-interval-in-seconds="10" 
    connection-leak-reclaim="false" 
    connection-leak-timeout-in-seconds="0" 
    connection-validation-method="auto-commit" 
    datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" 
    fail-all-connections="false" idle-timeout-in-seconds="300" 
    is-connection-validation-required="false" 
    is-isolation-level-guaranteed="true" lazy-connection-association="false" 
    lazy-connection-enlistment="false" match-connections="false" 
    max-connection-usage-count="0" max-pool-size="32" 
    max-wait-time-in-millis="60000" name="MY_POOL" 
    non-transactional-connections="false" 
    pool-resize-quantity="2" 
    res-type="javax.sql.DataSource" 
    statement-timeout-in-seconds="-1" 
    steady-pool-size="8" 
    validate-atmost-once-period-in-seconds="0"
    wrap-jdbc-objects="false">
        <property name="serverName" value="localhost"/>
        <property name="portNumber" value="3306"/>
        <property name="databaseName" value="nippon"/>
        <property name="User" value="root"/>
        <property name="Password" value="root"/>
        <property name="URL" value="jdbc:mysql://localhost:3306/nippon"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    </jdbc-connection-pool>
    <jdbc-resource enabled="true" jndi-name="JNDI_NAME" object-type="user" pool-name="MY_POOL"/>
</resources>

persistence.xml

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="UNIT_NAME" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>JNDI_NAME</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="create"/>
        </properties>
    </persistence-unit>
</persistence>

根据目前的GF文档,glassfish-resources.xml只用于服务器资源(连接池和JDBC资源)的生成,数据库生成可以从persistence.xml轻松管理。

【讨论】:

  • 你能分享你的 glassfish-resources.xml 吗?似乎 Glassfish-server 没有忽略我的 glassfish-resources.xml 但缺少一些属性。
【解决方案2】:

看起来 jdbc 数据源的 Glassfish v4 配置与 v3 相比有所改变。您需要指定connectionAttributes 属性来创建数据库。属性createDatabase 没有记录并且可能被忽略。

属性connectionAttributes 也没有很好的文档记录,但您可以在 Glassfish 4 PDF 文档(Administration Guide - 管理 JDBC 连接池部分)或源自 Glassfish 4 的 Payara server 的源代码中找到示例.

【讨论】:

  • 还有什么建议吗?
猜你喜欢
  • 2013-03-10
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多