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

标签 java postgresql hibernate tomcat maven-tomcat-plugin

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

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

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

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

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

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

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

数据库与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 数据库的数据库。

标签是:

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

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

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

关于java - PostgreSQL - 用户缺乏权限或找不到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315160/

相关文章:

sql - HSQLDB/Oracle - IN 子句中超过 1000 项

java - hibernate +Spring MVC : external objects library

java - Hibernate标准查询: trouble getting Set of a Domain object

java - 将 ANTLR 解析树转换为 JSON

java - 我怎样才能改变我的 ListView 的字体颜色和字体类型

java - 是否可以使用 gradle 'application' 插件指定多个主类

Java:对 2.5M 字符串使用互斥正则表达式 (15) 的有效方法?

sql - 我无法为具有最小值的获取行编写选择

linux - 无法连接到 PostgreSQL 服务器 : could not connect to server: Permission denied

postgresql - 如何在 PostgreSQL 中对数据进行分组?