1

プロジェクトにpostgreSQLサーバーの使用を開始しました。これを使用するのは初めてです。以前に他の商用リレーショナル db サーバーと mysql を使用したことがありますが、多くの問題はありませんでした。私は、スプリングベースでマルチスレッドの 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>

アプリケーションを実行すると、よくある問題が 2 つあります。

  1. org.postgresql.util.PSQLException: pstmt.setString(1, variable) の update ステートメントのパラメーター 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.DelegatingConnection.commit(DelegatingConnection.java:301) で org.apache.commons.dbcp. PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:200)

#2の場合、接続からのステートメントの取得に失敗していないにもかかわらず、コミットしようとすると発生します。

誰でも (postgreSQL を使用したことがある、またはデータソースの設定に精通している) 何が問題なのか教えてもらえますか?

ありがとう。

4

0 に答える 0