当前位置: 首页 > 知识库问答 >
问题:

连接到PostgreSQL的Grails应用程序的奇怪行为

刘阳舒
2023-03-14

我正在尝试将我的grails应用程序从h2切换到PostgreSQL。我为达到目标所做的步骤:

>

  • 从http://jdbc.postgresql.org/download.html下载JDBC(JDBC4 Postgresql驱动程序,版本9.3-1100)
  • 将JDBC附加到 /lib文件夹
  • 更改数据源。现在看起来像:

    dataSource {
        pooled = true
        driverClassName = "org.postgresql.Driver"
        dialect="org.hibernate.dialect.PostgreSQLDialect"
        username = "postgres"
        password = "admin"
    }
    hibernate {
        cache.use_second_level_cache = true
        cache.use_query_cache = false
        cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
    }
    // environment specific settings
    environments {
        development {
            dataSource {
                dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
                //url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
            }
        }
        test {
            dataSource {
                dbCreate = "update"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
            }
        }
        production {
            dataSource {
                dbCreate = "update"
                url = "jdbc:postgresql://localhost:5432/admin_panel"
                pooled = true
                properties {
                   maxActive = -1
                   minEvictableIdleTimeMillis=1800000
                   timeBetweenEvictionRunsMillis=1800000
                   numTestsPerEvictionRun=3
                   testOnBorrow=true
                   testWhileIdle=true
                   testOnReturn=true
                   validationQuery="SELECT 1"
                }
            }
        }
    }
    

    现在比赛开始了。我在GGTS中键入“run app”时出错。由于验证原因,我试图使用引导创建的对象无法初始化:初始化应用程序时出错:在save()过程中发生验证错误。。这真的很奇怪,因为消息说对之前创建的对象的引用为空:对象的adminpanel中的Field error。组成部分字段“子页面”上的“文本”:拒绝的值[null] 。在这一行中,“子页面”不应该为空,所以我去pgAdmin III检查是否创建了该记录,在那里我注意到根本没有创建任何表。

    如果应用程序连接到H2,Everything就会工作,但当我将其切换到postgres时,它就会开始崩溃。此外,当我从引导中删除所有内容时,应用程序将启动,我可以正常创建对象,但我仍然无法在pgAdmin中看到它们。你有什么建议吗?我还能查什么,或者为什么GORM在我使用PostgreSQL时不在我的应用程序中创建表?

    提前谢谢。

    编辑:

    经过几次测试,我找到了问题的根源。。。PostgreSQL为每个表中的“id”列提供了一个奇怪的值。当我使用H2时,我的值是1。。在每个表中,在PostgreSQL中,我都有这样的东西:

    table1
    id:
    1
    2
    3
    -
    7
    8
    9
    
    table2
    id:
    4
    5
    6
    -
    10
    11
    

    正如您可能注意到的,不同表中的所有行的值都是可交换的,因此我不能有id为1的对象table1和id为1的对象table2。你知道为什么吗?


  • 共有1个答案

    方建明
    2023-03-14

    Grails/HiberNate使用Sequence作为Postgres(或Oracle等)等数据库的对象ID。默认情况下,Grails使用共享序列(hibernate_sequence)。所以所有对象都有uniq id,但对整个数据库来说是唯一的,而不是对每个表。

    您可以将域配置为对域使用不同的序列,例如:

    static mapping = {
        id generator: 'sequence', params: [sequence: 'my_own_sequence']
    }
    

    另见

    • http://www.postgresql.org/docs/9.1/static/sql-createsequence.html
    • http://grails.org/doc/2.3.4/ref/Database映射/id.html
     类似资料:
    • 我的grails 2.1.0应用程序是在cloudfoundry中部署和运行的,使用mysql服务,昨天我做了一些更改,更新后无法再次运行。我没有对数据源进行任何更改。 通过查看tomcat日志,看起来数据库设置在部署时没有被覆盖,如文档中所述,并且存在一个异常消息“无法为连接URL“JDBC:h2:prodDb;MVCC=TRUE”创建类为“com.mysql.JDBC.driver”的JDBC

    • 我有一个python应用程序,通过vertica python客户端与vertica数据库交互。目前没有连接池来管理连接,而是为每个请求打开一个新连接,然后在请求结束时关闭。然而,这种设计将花费处理并发请求的成本。此外,python应用程序在uwsgi和Nginx服务器上运行,以处理多个请求。 我想使用现有的连接池来处理从python到vertica的连接,但在python中似乎找不到像C3Po或

    • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

    • 我正在使用Hibernate从Karaf 2.3连接到PostgreSQL。4容器,当我部署包时,有一个异常是javax。命名。NameNotFoundException osgi:service/javax。sql。DataSource/“(osgi.jndi.service.name=jdbc/postgresds)。 这是我的坚持。xml文件 这是我的blueprint.xml文件: 这是我

    • 我有一个由组成的应用程序,它在网络连接更改时被调用(基本上,我只想在连接到某个SSID时调用某些URL)。 我在挂起OkHttp请求时遇到了一个奇怪的问题。有时请求立即得到处理,有时需要10或20秒。我已经尝试为使用的OkHttpClient设置连接、读写超时,但没有成功。请求是在电话连接到网络之后发出的。我也尝试在延迟2秒的seperate线程中激发请求,但这并没有改变任何事情。 货单中的接收者

    • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么