2016-04-26 16 views
0

非常に混乱する状況に直面しており、これがバグかどうかわかりません。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を使うことができるように、そこには解決策がありますか?

答えて

0

[OK]問題の原因を確認しました。 PostgreSQL JDBCドライバは、コンテキスト設定と2回目のWebアプリケーションの結果、Jettyによって2回ロードされたと思われます。

ウェブアプリケーションからの依存関係を削除し、アプリケーションを読み込むためにjettyに残して問題を解決しました。私のビルドツールはGradleなので、これはWebアプリケーション用のpostgresqlドライバの依存関係をcompileOnlyに設定することを意味します。

関連する問題