我开始为我的项目使用 postgreSQL 服务器。这是我第一次使用它。我之前使用过其他商业关系数据库服务器和 mysql,但我没有遇到很多问题。我有一个基于 spring 和多线程的 java 应用程序。我正在使用 postgreSQL jdbc 9 版本。
这是数据源的弹簧配置。
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${tribune.jdbc.url}"/>
<property name="username" value="${tribune.jdbc.username}"/>
<property name="password" value="${tribune.jdbc.password}"/>
<property name="initialSize" value="20"/>
<property name="maxActive" value="40"/>
<property name="maxIdle" value="1"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="true"/>
<property name="defaultAutoCommit" value="false"/>
<property name="validationQuery" value="select version()"/>
</bean>
当我运行我的应用程序时,我看到两个常见问题。
org.postgresql.util.PSQLException:没有为 pstmt.setString(1, variable) 的更新语句的参数 1 指定值;我在此行之前检查变量以查看它是否为空或 null。但它仍然会发生。
if (programId == null || programId.isEmpty()) { throw new IllegalArgumentException("'programId' can not be null."); } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; SubscriptionGroup subscriptionGroup = new SubscriptionGroup(); conn = session.getConnection(); String query = getQuery(QUERY_GET_NOTIFICATIONS_BY_PROGRAM_ID); log.debug("getSubscriptionGroupByProgramId.query: " + query); log.info("getSubscriptionGroupByProgramId.programId: " + programId + "=="+ programId.length()); pstmt = conn.prepareStatement(query); pstmt.setString(1, programId); rs = pstmt.executeQuery();
'rs = pstmt.executeQuery()' 引发异常。
- 原因:org.postgresql.util.PSQLException:发送到后端时发生 I/O 错误。在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:283) 在 org.postgresql.jdbc2.AbstractJdbc2Connection.executeTransactionCommand(AbstractJdbc2Connection.java:685) 在 org.postgresql.jdbc2.AbstractJdbc2Connection.commit(AbstractJdbc2Connection.java :709) 在 org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:301) 在 org.apache.commons.dbcp 的 org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:301)。 PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:200)
对于#2,它发生在它尝试提交时,即使它没有从连接中获取语句失败。
任何人(使用过 postgreSQL 或熟悉数据源设置的人)可以告诉我问题出在哪里吗?
谢谢。