2

当我尝试在服务器上运行我的应用程序时出现错误。我正在起诉eclipse和glass fish server 4。我制作了一个glassfish-resources.xml文件并将其放在WEB-INF目录中。当我尝试在服务器上运行时。我得到以下异常

Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: 
Connection could not be allocated because: Invalid Oracle URL specified: 
OracleDataSource.makeURL
Error Code: 0
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:316)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:135)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connectInternal(DatasourceAccessor.java:330)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.connectInternal(DatabaseAccessor.java:307)
.....

这是我的 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/myOracleConnectionPool"  
                res-type="javax.sql.ConnectionPoolDataSource"  
                datasource-classname="oracle.jdbc.pool.OracleConnectionPoolDataSource">  

        <property name="User" value="system" />  
        <property name="Port" value="1521" />  
        <property name="DatabaseName" value="XE" />  
        <property name="ServerName" value="127.0.0.1" />  
        <property name="Url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />  
        <property name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /> 
        <property name="Password" value="xxxx" />  
    </jdbc-connection-pool>  


    <jdbc-resource enabled="true"  
            jndi-name="java:app/jdbc/myOracleDatasource"  
            object-type="user"  
            pool-name="java:app/myOracleConnectionPool">  
        <description />  
    </jdbc-resource>  
</resources> 

这是我的 persistence.xml 文件

<persistence-unit name="chapter11PU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:app/jdbc/myOracleDatasource</jta-data-source>
    <properties>
        <property name="eclipselink.target-database" value="Oracle"/>
        <property name="javax.persistence.schema-generation-action" value="drop-and-create"/>
        <property name="javax.persistence.schema-generation-target" value="scripts"/> 
        <property name="javax.persistence.ddl-create-script-target" value="createfoo.sql"/> 
        <property name="javax.persistence.ddl-drop-script-target" value="dropfoo.sql"/> 
        <property name="eclipselink.deploy-on-startup" value="true"/>
        <property name="eclipselink.application-location" value="/tmp"/>

        <!-- To log SQL queries -->
        <property name="eclipselink.logging.level.sql" value="FINE"/>
        <property name="eclipselink.logging.parameters" value="true"/>
        <property name="eclipselink.logging.level" value="INFO"/>
    </properties>
</persistence-unit>

我还将 ojdbc6.jar 放在 lib/ext 文件夹中。我正在使用 oracle 11g 第 2 版。为什么我收到无效的 url 错误?

我还检查了 SQL Developer 中的连接,它正在使用用户系统和我的密码工作。

谢谢

4

2 回答 2

2

看起来您两次错误地给出了 url 并且属性名称不正确。

<property name="Url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />  
<property name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /> 

它应该是

<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /> 

此外,参考 glassfish 4.1 的文档以获取可以在 glassfish-resources.xml 中使用的正确属性名称也是一个好主意

对于 Glassfish 3.1,此处给出了选项

于 2013-10-26T18:17:01.683 回答
0

我已经解决了这个问题。实际上,我使用的是 EJB 3.1、JSF 2.2、Java EE 7 和 glass fish 4。我的 JSF 控制器调用 EJB 来执行 CRUD 操作。我在persistence.xml中有这样的东西

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
         version="2.1">

    <persistence-unit name="chapter11PU" transaction-type="JTA">
        <jta-data-source>java:app/jdbc/myOracleDatasource</jta-data-source>
        <properties>
            <property name="eclipselink.target-database" value="Oracle"/>
            <property name="eclipselink.ddl-generation.output-mode" value="both"/>
            <property name="eclipselink.create-ddl-jdbc-file-name" value="createDDL.sql"/>
            <property name="eclipselink.drop-ddl-jdbc-file-name" value="dropDDL.sql"/>
            <property name="eclipselink.application-location" value="E:/eclipse-kepler/workspace/Java EE 7/ch11_ProcessAndNavigation/src/main/resources/" />
            <property name="eclipselink.ddl-generation"  value="drop-and-create-tables"/>

            <!-- To log SQL queries -->
            <property name="eclipselink.logging.level.sql" value="FINE"/>
            <property name="eclipselink.logging.parameters" value="true"/>
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>

笔记:

The "java:app/jdbc/myOracleDatasource" data source required by the persistence unit 
must be created within the EJB container. And there are several ways to do so. The 
simplest one is to have a @DataSourceDefinition annotation on any Managed Bean. The 
container will deploy the bean and create the data source. Another way is to use the 
GlassFish interface.

所以我在我的 EJB 上使用了类似的东西

@Named
@Stateless
@DataSourceDefinition(
    className = "oracle.jdbc.pool.OracleConnectionPoolDataSource",
    name = "java:app/jdbc/myOracleDatasource",
    user = "system",
    password = "xxxx",
    databaseName = "XE",
    portNumber=1521,
    properties={"url=jdbc:oracle:thin:@localhost:1521:XE"}
) 
public class BookEJB  {
    ....
}

我缺少的是properties={"url=jdbc:oracle:thin:@localhost:1521:XE"}属性。所以它给了我错误。将此属性添加到@DataSourceDefinition. 错误消失了,事情开始正常了。

谢谢

于 2013-10-27T06:28:28.413 回答