PostgreSQL - 用户缺乏权限或找不到对象

PostgreSQL - User lacks priviledge or object not found

我有一个使用 Hibernate 和 PostgreSQL 的应用程序,我用 Maven 将其编译为 WAR 并将其部署到 Tomcat 8.0,有时我会遇到以下问题 这个错误:

"User lacks priviledge or object not found: TABLE_NAME".

显然,这个问题的答案总是 "Check the priviledges to that user, and check if the table/database exists"。

这绝对不是问题,因为这种情况偶尔会发生,即我的应用程序运行良好,当我部署它的新版本时,有时在部署后它会抛出此错误。

我总是使用 Jenkins 部署我的应用程序,并且部署到 Tomcat 是成功的,应用程序正在运行,但是如果我调用一个使用数据库服务的操作,它就会因这个错误而失控。在其上进行 2 到 3 次干净部署后,这会清除(即我停止 Tomcat,清理目录,启动它并 运行 使用相同版本的代码再次使用 Jenkins 部署。

仍然很奇怪,在干净部署后它没有解决问题。即使重新启动整个服务器(不是 Tomcat,Windows 服务器),它仍然会发生。

我读到的关于可能原因的最接近的解释是,有时它可以创建一个 ghost 连接 到数据库,当它试图查询某些东西时它不能,因为它并没有真正连接。

数据库与Tomcat在同一台服务器上,因此应用程序指向本地主机以连接到数据库。我不认为这是相关的,因为它也发生在数据库位于不同服务器的 Quality Rnvironment 中。

我的数据库配置文件是这样的:

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <alias name="appDataSource" alias="jpaDataSource" />    
    <alias name="jpaTransactionManager" alias="appTransactionManager" />

    <bean id="appDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="${postgre.url}" /> 
        <!-- jdbc:postgresql://127.0.0.1:5432/DEV_DATABASE -->
        <property name="username" value="${postgre.username}" />
        <property name="password" value="${postgre.password}" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="jpaDataSource" />
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="packagesToScan" value="${persistence.jpa.packagesToScan}" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
                <prop key="hibernate.jdbc.use_get_generated_keys">true</prop>
            </props>
        </property>
        <property name="sharedCacheMode" value="ENABLE_SELECTIVE" />
        <property name="validationMode" value="NONE" />
    </bean>
</beans>

有人知道这可能是什么吗?

几个月过去了,我终于弄清楚发生了什么事。

显然我有一个嵌入式数据库的配置,有时(虽然很少)应用程序会连接到这个嵌入式数据库,而不是我配置为连接到 Postgres 数据库的那个。

标签是:

<jdbc:embedded-database id="appDataSource" />

因为这是一个空模型数据库,它会引发 "User lacks priviledge or object not found" 错误,因为 table 在这个空数据库中不存在。

删除它后,问题解决了,它现在总是连接到正确的数据库。