我有一个使用 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/