新聞中心
問題描述:
JBoss JDBC驅(qū)動時,第一次建立如果庫連接會拋出類似于下面的異常

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ù)庫連接時卻是正常的。
解決方法:
將JBoss JDBC驅(qū)動拷貝到j(luò)boss_server_home/lib目錄下。這個方法對于每一個jboss環(huán)境都需要進(jìn)行這樣的拷貝,比較麻煩。
問題分析:
出現(xiàn)這個問題的JBoss服務(wù)器配置文件jboss_server_home/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml里的UseJBossWebLoader配置項應(yīng)該都是配置成為false的,即使用的并不是JBoss共享扁平的ClasssLoader并且jboss_server_home/lib不包含JBoss JDBC驅(qū)動。下面我們來分析造成這個問題的具體原因。
首先我們來了解一下JBoss JDBC驅(qū)動的管理。JBoss JDBC驅(qū)動程序在載入的時候都會通過java.sql.DriverManager.registerDriver(Driver)方法將自身注冊到驅(qū)動管理器中。在注冊后我們就可以通過DriverManager.getDriver(String url)方法取得能夠處理傳入的數(shù)據(jù)庫url的驅(qū)動程序,或者通過DriverManager.getConnection(String url, String user, String password)方法取得url對應(yīng)驅(qū)動的連接。但在這里有一個問題需要我們注意,在取得連接或者驅(qū)動的時候,它需要從已注冊的驅(qū)動里選擇合適的驅(qū)動程序出來。這個合適的驅(qū)動總結(jié)出來有兩條
一是當(dāng)前調(diào)用getDriver或getConnect方法的類的ClassLoader能夠載入相應(yīng)的JBoss JDBC驅(qū)動程序,并且載入的JBoss JDBC驅(qū)動程序類要和已注冊的驅(qū)動程序類相等,調(diào)用getDriver或getConnect方法的類ClassLoader通過本地方法DriverManager.getCallerClassLoader()獲得,它得到調(diào)用類的ClassLoader。
二是對于符合前面條件的驅(qū)動,還需要判斷當(dāng)前這個驅(qū)動能不能處理連接url,如果不符合,則從注冊的驅(qū)動里查找下一次驅(qū)動,如果滿足,則使用這個驅(qū)動來創(chuàng)建連接。
標(biāo)題名稱:JBossJDBC驅(qū)動報錯問題分析與解決
標(biāo)題鏈接:http://m.5511xx.com/article/dpgedcg.html


咨詢
建站咨詢
