非常に混乱する状況に直面しており、これがバグかどうかわかりません。PostgreSQL JDBCドライバは、JettyコンテキストコンフィグレーションでロードされたDBCPとJNDIで使用されたときにSQLタイプを推論できません
私は、Jettyが管理するプールされたデータソースとしてPostgreSQLを使用しようとしています。 DBCP2.1は、プール・マネージャーとしても使用されます。
DataSource source = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/dbpool");
この私が設定しようとするまで、すべてが正常に動作します:データソースはその後、このようなもので、私のコードで取得され
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war">
<Property name="jetty.webapps" default="."/>/root.war
</Set>
<Set name="extractWAR">true</Set>
<Set name="copyWebDir">false</Set>
<Set name="configurationDiscovered">true</Set>
<!-- Postgresql connection pool using DBCP2 -->
<New id="ketabakds" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>
<Ref refid='wac'/>
</Arg>
<Arg>jdbc/dbpool</Arg>
<Arg>
<New class="org.apache.commons.dbcp2.BasicDataSource">
<Set name="driverClassName">org.postgresql.Driver</Set>
<Set name="url">jdbc:postgresql://localhost:5432/pg_databse</Set>
<Set name="username">pg_user</Set>
<Set name="password">pg_pass</Set>
</New>
</Arg>
</New>
</Configure>
:データソースは、これと同様の桟橋コンテキストの設定ファイルで設定されていますPGobjectクラスを使って準備されたステートメント上のもの。例えば、私はいくつかのJSONを渡すためにこのコードを持っている:
ここ PGobject jsonObject = new PGobject();
jsonObject.setType(JSON_TYPE);
jsonObject.setValue(json);
statement = aConnection.prepareStatement(
"insert into " +
tableName() +
" (data) values (?)"
);
statement.setObject(1, jsonObject);
statement.executeUpdate();
私はこのエラーを取得する:私もPgPreparedStatement.java:1039にデバッグ
org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgresql.util.PGobject. Use setObject() with an explicit Types value to specify the type to use.
at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1039) ~[postgresql-9.4.1208.jar:9.4.1208]
at org.apache.commons.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:189) ~[commons-dbcp2-2.1.1.jar:2.1.1]
at org.apache.commons.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:189) ~[commons-dbcp2-2.1.1.jar:2.1.1]
、非常に興味深い点は、ということです値(xという名前で渡された)はまだPGobject型ですが、PGobjectのxインスタンスを評価するとfalseを返します。
問題は、JettyがPGのJDBCドライバを2回ロードすることが問題であると思われます。コンテキストのコンフィグレーションをロードするときと、WARアプリケーションがロードされるときに2回目のロード。したがって、両方が正確なパッケージ名を持っていても、2つのPGobjectクラスがあります。
私は桟橋ではありませんが、それは可能ですか?準備ができている文に値を渡すためにPGobjectを使うことができるように、そこには解決策がありますか?