问题:web每次请求都会动态连接数据库;dbname是个数据库名参数,
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; }
原因:重重加载同一个文件;
错误表明sqlite_jni.dll已经被JVM的ClassLoader load了。通过查阅资料发现Web
Server的自动重启机制是产
生这一问题的根源。当Resin重启包含sqlite_jni.dll的这个Web应用时,会因为Variant类的语句而自动执行
jsqlite_jni.dll的加载。但重启Web应用并不是重启整个resin(即:上一次启动的JVM仍然存在),也就是说
sqlite_jni.dll已经被加载过了,因此系统将抛出错误。而当我们手工重启resin时,则会将上一次启动的JVM关闭并重新启动,这时会正常
加载sqlite_jni.dll。
解决:把sqlite.jar即sqlite jdbc驱动放到resion/tomcat中的公共lib目录下;而不是放在应用即:web-inf/lib下;
因为sqlite.jar中,有sqlite_jni.dll文件加载的调用类;
原文章地址:http://blog.csdn.net/yangsp1/archive/2009/04/23/4103065.aspx
|