ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

GlassFish3でアプリをデプロイした後、JDBCドライバーが見つからないときの対処

GlassFish3でアプリをデプロイした後、JDBCドライバーが見つからないときの対処方法です。

環境

OS CentOS6.4 x64
GlassFish 3.1.2.2
DB PostgreSQL9.x

現象

GlassFishでアプリをデプロイした後、そのアプリにアクセスすると画面が真っ白で何も表示されない現象が発生します。


GlassFishのログを見ると以下のエラーが書かれていました。
server.log(一部抜粋)

[#|2013-12-26T12:45:05.869+0900|WARNING|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=419;_ThreadName=Thread-2;|ApplicationDispatcher[/Hoge] PWC1231: Servlet.service() for servlet jsp threw exception
java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/hogedb?loginTimeout=0&socketTimeout=0&prepareThreshold=5&unknownLength=2147483647&tcpKeepAlive=false&binaryTransfer=true
        at java.sql.DriverManager.getConnection(DriverManager.java:596)
        at java.sql.DriverManager.getConnection(DriverManager.java:215)
        at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:98)
        at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:81)
        at com.sun.gjc.spi.DSManagedConnectionFactory.createManagedConnection(DSManagedConnectionFactory.java:115)
        at com.sun.enterprise.resource.allocator.LocalTxConnectorAllocator.createResource(LocalTxConnectorAllocator.java:87)
        at com.sun.enterprise.resource.pool.ConnectionPool.createSingleResource(ConnectionPool.java:907)
        at com.sun.enterprise.resource.pool.ConnectionPool.createResource(ConnectionPool.java:1189)
        at com.sun.enterprise.resource.pool.datastructure.RWLockDataStructure.addResource(RWLockDataStructure.java:98)
        at com.sun.enterprise.resource.pool.ConnectionPool.addResource(ConnectionPool.java:282)
        at com.sun.enterprise.resource.pool.ConnectionPool.createResourceAndAddToPool(ConnectionPool.java:1512)
        at com.sun.enterprise.resource.pool.ConnectionPool.createResources(ConnectionPool.java:944)
        at com.sun.enterprise.resource.pool.ConnectionPool.initPool(ConnectionPool.java:230)
        at com.sun.enterprise.resource.pool.ConnectionPool.internalGetResource(ConnectionPool.java:511)
        at com.sun.enterprise.resource.pool.ConnectionPool.getResource(ConnectionPool.java:381)
        at com.sun.enterprise.resource.pool.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:245)
        at com.sun.enterprise.resource.pool.PoolManagerImpl.getResource(PoolManagerImpl.java:170)
        at com.sun.enterprise.connectors.ConnectionManagerImpl.getResource(ConnectionManagerImpl.java:338)
        at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:301)
        at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:190)
        at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:165)
        at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:160)
        at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:113)
        (続く)


GlassFishJDBCの設定を行って、ドライバーも配置したのになぜかドライバーがないと怒られます。
デプロイのたびにGlassFish再起動なんてやってられません。


一応JDBCドライバーの配置先を確認しました。
以下の場所にJDBCドライバーのjarファイルを配置しています。

/usr/local/glassfish3/glassfish/domains/domain1/lib/ext


いろいろと調べていると、GlassFishのバグ、ライブラリに配置場所を「domain1/lib」にしていないかという書き込みがありました。
ちなみにGlassFish4でもこの現象が発生するんだとか。

解決方法

アプリのライブラリにJDBCドライバーを含めるとデプロイしてもドライバーがないと言われなくなります。


これで解決なのですが2つ気になることがあります。
複数のアプリをデプロイしていて、アプリごとに異なるJDBCドライバーのバージョンがあった場合、動作はどうなるのか?


また、DBの接続先が同じアプリが2つあり、1つはアプリ内にドライバーを含む、もう1つはドライバーを含まないという風にした場合どうなるのか?
この場合、後者でもDBに接続できることがわかりました。
となると、アプリのライブラリはGlassFish内では共有されているということになるのでしょうか?


まだ触りたてで良く分かっていないのでその辺も勉強していこうと思います。


Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)