Glassfish 3 连接池抛出 java.sql.SQLSyntaxErrorException:ORA-00933

Glassfish 3 Connection Pool throws java.sql.SQLSyntaxErrorException: ORA-00933

我正在使用 Glassfish 3 服务器 运行 网络服务。 连接池在服务器实现,可以ping通数据库。

已从服务器收到连接,但在 运行 宁 PreparedStatement 时抛出 java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended 异常。

Glassfish 4 does not throw any exception

查询取自 属性 文件

QUERY=select * from TABLE where SYSTEMID=?1

使用两个单独的 java 类 接收连接和进一步处理

JDBCUtil.java

public static Connection connectionFromConnectionPool()
        throws NamingException, SQLException {
    Context initCtx = new InitialContext();
    DataSource dataSource = (DataSource) initCtx.lookup(PropertyFileReader
                            .getPropertyValue("connectionPool.JNDI.name"));
    Connection connection = (Connection) dataSource.getConnection();
    if (connection != null) {
        logger.info("Received Connection");
    } else {
        logger.info("No Connection Received");
    }

    return connection;
}

DAO.java

ResultSet resultSet = null;
    PreparedStatement preparedStatement = null;
    Connection connection = null;
    try {
        connection = JDBCUtil.connectionFromConnectionPool();

        if (connection != null) {
            preparedStatement = connection
                    .prepareStatement(PropertyFileReader
                            .getPropertyValue("QUERY"));
            if (preparedStatement != null) {
                preparedStatement.setString(1, "systemID");
                resultSet = preparedStatement.executeQuery();     // line No:56

生成的日志:

18:13:35,328 INFO - *****.JDBCUtil.connectionFromConnectionPool(JDBCUtil.java:38) - Received Connection
18:13:35,397ERROR - *****(DAO.java:81) - **************************** :: 
java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40.executeQuery(PreparedStatementWrapper40.java:642)
at *************************************(DAO.java:56)
....................

ojdbc6.jar放在glassfish3\glassfish\libglassfish4\glassfish\lib

检查服务器文件夹中是否还有其他 ojdbc jar,尤其是您正在使用的域文件夹中。

如果服务器文件夹中有不同的jar或者不同版本的jar,可能会出现这样的错误。

例如:glassfish3\glassfish\domains\domain1\lib...

如果有不同版本的jar文件,全部替换成相同版本。

我使用 Glassfish4。我只将 ojdbc jar 保存在 glassfish4\glassfish\lib 中,这对我来说很好用。