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) (続く)
GlassFishでJDBCの設定を行って、ドライバーも配置したのになぜかドライバーがないと怒られます。
デプロイのたびに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)
- 作者: Antonio Goncalves,日本オラクル株式会社,株式会社プロシステムエルオーシー
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/09
- メディア: 大型本
- 購入: 5人 クリック: 147回
- この商品を含むブログ (28件) を見る