|
問題:web每次請(qǐng)求都會(huì)動(dòng)態(tài)連接數(shù)據(jù)庫(kù);dbname是個(gè)數(shù)據(jù)庫(kù)名參數(shù),
private Connection getConn() throws SQLException{ Connection conn=null; try { Class.forName("SQLite.JDBCDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } if(dbName!=null&&dbName.length()>4){ conn=DriverManager.getConnection("jdbc:sqlite:/c:\\sqlite3\\"+dbName+".db"); } return conn; }
原因:重重加載同一個(gè)文件;
錯(cuò)誤表明sqlite_jni.dll已經(jīng)被JVM的ClassLoader load了。通過(guò)查閱資料發(fā)現(xiàn)Web
Server的自動(dòng)重啟機(jī)制是產(chǎn)
生這一問題的根源。當(dāng)Resin重啟包含sqlite_jni.dll的這個(gè)Web應(yīng)用時(shí),會(huì)因?yàn)閂ariant類的語(yǔ)句而自動(dòng)執(zhí)行
jsqlite_jni.dll的加載。但重啟Web應(yīng)用并不是重啟整個(gè)resin(即:上一次啟動(dòng)的JVM仍然存在),也就是說(shuō)
sqlite_jni.dll已經(jīng)被加載過(guò)了,因此系統(tǒng)將拋出錯(cuò)誤。而當(dāng)我們手工重啟resin時(shí),則會(huì)將上一次啟動(dòng)的JVM關(guān)閉并重新啟動(dòng),這時(shí)會(huì)正常
加載sqlite_jni.dll。
解決:把sqlite.jar即sqlite jdbc驅(qū)動(dòng)放到resion/tomcat中的公共lib目錄下;而不是放在應(yīng)用即:web-inf/lib下;
因?yàn)閟qlite.jar中,有sqlite_jni.dll文件加載的調(diào)用類;
原文章地址:http://blog.csdn.net/yangsp1/archive/2009/04/23/4103065.aspx
|