【问题标题】:PostgreSQL - User lacks priviledge or object not foundPostgreSQL - 用户缺乏特权或找不到对象
【发布时间】:2018-07-12 22:10:09
【问题描述】:

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

“用户缺少权限或找不到对象:TABLE_NAME”。

很明显,这个问题的答案总是“检查该用户的权限,并检查表/数据库是否存在”。

这绝对不是问题,因为这偶尔会发生,即我的应用程序工作正常,当我部署它的新版本时,有时在部署后它会抛出此错误。

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

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

我读到的关于可能原因的最接近的解释是,有时它可以创建到数据库的 ghost 连接,而当它尝试查询某些内容时却无法查询,因为它并没有真正连接.

数据库和Tomcat在同一台服务器上,所以应用程序指向localhost来连接数据库。我不认为这是相关的,因为它也发生在数据库位于不同服务器中的 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 错误信息,这是 HSQLDB 错误信息

标签: java postgresql hibernate tomcat maven-tomcat-plugin


【解决方案1】:

几个月过去了,我已经知道发生了什么。

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

标签是:

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

因为这是一个空的模型数据库,它会引发“用户缺少权限或找不到对象”的错误,因为这个空数据库中不存在该表。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2017-06-14
    • 2019-05-31
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多