プロジェクトに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 つあります。
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()」から例外がスローされます。
- 原因: 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 を使用したことがある、またはデータソースの設定に精通している) 何が問題なのか教えてもらえますか?
ありがとう。