【问题标题】:Integrating oracle 11g with Grails and Hibernate将 oracle 11g 与 Grails 和 Hibernate 集成
【发布时间】:2016-05-29 06:32:18
【问题描述】:

我创建了一个简单的 grails 3 应用程序。我正在尝试将它连接到数据源配置中的 Oracle 数据库。

当我跑步时

SELECT * FROM V$VERSION

在sql developer中,返回关于我的数据库的以下数据。

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

我的 application.yml 文件如下所示:

dataSources:
    dataSource:
        pooled: true
        dialect: org.hibernate.dialect.Oracle10gDialect
        driverClassName: 'oracle.jdbc.OracleDriver'
        username: 'superCool'
        password: 'password'
        url: 'jdbc:oracle:thin:@127.0.0.1:1521:coolio'
        dbCreate: ''

我的 build.gradle 文件包含这些用于 hibernate 和 oracle 依赖项的行。

dependencies {
    (...)
    compile "org.grails.plugins:hibernate:4.3.10.5"
    (...)
    compile "org.hibernate:hibernate-ehcache"
    compile("com.oracle:ojdbc7:12.1.0.2")
}

我的服务文件如下:

class DatabaseService {

DataSource dataSource

public void testMyDb(User user) {
    try {
        registerUser(new Sql(dataSource), user)
    } catch (SQLException e) {
        LOGGER.error("unable to register the user", e)
        throw e
    }
}

public void registerUser(Sql sql, User user) {
        sql.call("{call isertUser(?)}", [user.name])
}

如果我删除了

compile "org.grails.plugins:hibernate:4.3.10.5"

从 build.gradle,我可以运行我的集成测试并成功访问数据库。如果我把它放在那里,我会收到以下错误:

ERROR DatabaseService - unable to register the user
java.sql.SQLRecoverableException: Closed Connection
    at oracle.jdbc.driver.PhysicalConnection.getAutoCommit(PhysicalConnection.java:2254) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]

更新 1:

我更新了我的 build.gradle 文件以引用

compile("com.oracle:ojdbc6:11.2.0.2")

相对于

compile("com.oracle:ojdbc7:12.1.0.2")

现在生成的错误指的是setter:

ERROR DatabaseService - unable to register the user
java.sql.SQLRecoverableException: Closed Connection
    at oracle.jdbc.driver.PhysicalConnection.setAutoCommit(PhysicalConnection.java:2254) ~[ojdbc7-12.1.0.2.jar:12.1.0.2.0]

更新 2:

我捕获了 SQLException 并从中获取了 sql 错误代码。返回的代码:08003。根据https://docs.oracle.com/cd/E15817_01/appdev.111/b31228/appd.htm,

08003 - connection does not exist

所以此时,我在数据源中将 pooled 标志设置为 false,一切正常。所以这里的问题缩小到了这个范围。该插件对汇集的属性反应不佳。

我已发出以下 sql 命令来计算我的池的大小:

SELECT name, value  FROM v$parameter WHERE name = 'sessions';

返回 1524。

我也发出了sql命令查看当前分配的金额:

SELECT COUNT(*) FROM v$session;

返回 58。

我想现在的问题是,是什么导致了集合财产的疯狂。

【问题讨论】:

  • 您是否尝试过另一个休眠版本?例如较新的:compile "org.grails.plugins:hibernate4:5.0.0.RC1"?甚至降级到最新的 Hibernate3:runtime "org.grails.plugins:hibernate:3.6.10.19"?
  • @majkelo 刚刚尝试了您的建议,但似乎没有解决任何问题。同样的错误:/
  • 在重新启动和检查每个依赖项之前,您是否 grails clean 和 grails compile --non-interactive --refresh-dependencies?
  • 而且registerUser(Sql sql, User user)函数中没有错字:call isertUser -> call insertUser
  • 我最初进行了定期清理和编译。我执行了你所说的那个,它导致了大约 30 个错误,其中最主要的是在使用降级版本时无法启动嵌入式应用服务器。

标签: oracle hibernate grails gradle oracle11g


【解决方案1】:

解决方案是禁用我的池。我不知道它是否是一个错误,为什么它会失败,但它确实如此。谢天谢地,我使用 jndi 查找我的数据源,因此替换它产生了火花。

dataSources:
    dataSource:
        pooled: false
        dialect: org.hibernate.dialect.Oracle10gDialect
        driverClassName: 'oracle.jdbc.OracleDriver'
        username: 'superCool'
        password: 'password'
        url: 'jdbc:oracle:thin:@127.0.0.1:1521:coolio'
        dbCreate: ''

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2012-07-02
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多