获取错误指定的Oracle URL无效:OracleDataSource.makeURL

时间:2013-10-24 22:04:44

标签: java jdbc oracle11g jpa-2.0 glassfish-4

当我尝试在服务器上运行我的应用程序时出现错误。我正在起诉eclipse和玻璃鱼服务器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中的连接,它正在使用用户系统和我的密码。

由于

2 个答案:

答案 0 :(得分:1)

看起来你错误地给了两次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,选项为here

答案 1 :(得分:0)

我已经解决了这个问题。实际上我使用的是EJB 3.1,JSF 2.2,Java EE 7和玻璃鱼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后。错误消失了,事情开始正常。

谢谢