JBoss JDBC驅(qū)動(dòng)報(bào)錯(cuò)問題分析與解決
問題描述:
JBoss JDBC驅(qū)動(dòng)時(shí),第一次建立如果庫連接會(huì)拋出類似于下面的異常
21:21:36,666 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: null
org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: oracle.jdbc.driver.OracleDriver, url: jdbc:oracle:thin:@ 10.0.32 .25:1521:sid)
at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:179)
at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:565)
但在第二次取得數(shù)據(jù)庫連接時(shí)卻是正常的。
解決方法:
將JBoss JDBC驅(qū)動(dòng)拷貝到j(luò)boss_server_home/lib目錄下。這個(gè)方法對(duì)于每一個(gè)jboss環(huán)境都需要進(jìn)行這樣的拷貝,比較麻煩。
問題分析:
出現(xiàn)這個(gè)問題的JBoss服務(wù)器配置文件jboss_server_home/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml里的UseJBossWebLoader配置項(xiàng)應(yīng)該都是配置成為false的,即使用的并不是JBoss共享扁平的ClasssLoader并且jboss_server_home/lib不包含JBoss JDBC驅(qū)動(dòng)。下面我們來分析造成這個(gè)問題的具體原因。
首先我們來了解一下JBoss JDBC驅(qū)動(dòng)的管理。JBoss JDBC驅(qū)動(dòng)程序在載入的時(shí)候都會(huì)通過java.sql.DriverManager.registerDriver(Driver)方法將自身注冊(cè)到驅(qū)動(dòng)管理器中。在注冊(cè)后我們就可以通過DriverManager.getDriver(String url)方法取得能夠處理傳入的數(shù)據(jù)庫url的驅(qū)動(dòng)程序,或者通過DriverManager.getConnection(String url, String user, String password)方法取得url對(duì)應(yīng)驅(qū)動(dòng)的連接。但在這里有一個(gè)問題需要我們注意,在取得連接或者驅(qū)動(dòng)的時(shí)候,它需要從已注冊(cè)的驅(qū)動(dòng)里選擇合適的驅(qū)動(dòng)程序出來。這個(gè)合適的驅(qū)動(dòng)總結(jié)出來有兩條
一是當(dāng)前調(diào)用getDriver或getConnect方法的類的ClassLoader能夠載入相應(yīng)的JBoss JDBC驅(qū)動(dòng)程序,并且載入的JBoss JDBC驅(qū)動(dòng)程序類要和已注冊(cè)的驅(qū)動(dòng)程序類相等,調(diào)用getDriver或getConnect方法的類ClassLoader通過本地方法DriverManager.getCallerClassLoader()獲得,它得到調(diào)用類的ClassLoader。
二是對(duì)于符合前面條件的驅(qū)動(dòng),還需要判斷當(dāng)前這個(gè)驅(qū)動(dòng)能不能處理連接url,如果不符合,則從注冊(cè)的驅(qū)動(dòng)里查找下一次驅(qū)動(dòng),如果滿足,則使用這個(gè)驅(qū)動(dòng)來創(chuàng)建連接。
【編輯推薦】