电竞比分网-中国电竞赛事及体育赛事平台

分享

Unable to load sqlite_jni: java.lang.UnsatisfiedLinkError: already loaded in another classloader

 躍來(lái)躍去 2009-05-05

問題: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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多