1

我开始为我的项目使用 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>

当我运行我的应用程序时,我看到两个常见问题。

  1. 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()' 引发异常。

  1. 原因: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 或熟悉数据源设置的人)可以告诉我问题出在哪里吗?

谢谢。

4

0 回答 0