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

时间:2018-07-12 22:10:10

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

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

  

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

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

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

我始终使用Jenkins部署我的应用程序,并且成功部署到Tomcat,该应用程序正在运行,但是如果我调用消耗数据库服务的操作,则会因该错误而陷入困境。在其上进行2到3次全新部署后,此操作将清除(即,我停止Tomcat,清除目录,启动它,然后使用相同版本的代码再次使用Jenkins运行部署)。

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

我所读到的最可能的原因解释是,有时它可以建立与数据库的 ghost连接,并且当它尝试查询某些内容时由于它未真正连接而无法进行查询

该数据库与Tomcat位于同一台服务器上,因此该应用程序指向localhost以连接到该数据库。我不认为这是相关的,因为它也发生在数据库位于其他服务器中的质量环境中。

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

 <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>

有人对这可能是个想法吗?

1 个答案:

答案 0 :(得分:0)

已经几个月了,我已经能够找出正在发生的事情。

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

标签为:

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

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

删除此问题后,问题已解决,现在它始终连接到正确的数据库。