2014-01-10 44 views
2

我有一個簡單的servlet,它使用Tomcat-DBCP來獲取連接。使用Tomcat-DBCP的JDBC需要Tomcat自帶的lib驅動程序/ lib

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
... 
    Connection conn = null; 
    try { 
    conn = createConnection(); 
.... 
} 
public Connection createConnection() throws SQLException { 
     Connection conn = null; 
     DataSource datasource = new DataSource(); 
     PoolProperties p = new PoolProperties(); 
     p.setUrl("jdbc:oracle:thin:@localhost:1521:XE"); 
     p.setDriverClassName("oracle.jdbc.OracleDriver"); 
     p.setUsername("SYSTEM"); 
     p.setPassword("password"); 
     datasource.setPoolProperties(p); 
     try { 
      conn = datasource.getConnection(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return conn; 
    } 

它需要tomcat的/ lib文件夾中的ojdbc6.jar,而不是在WEB-INF/lib中。

  1. 爲什麼網絡應用程序自己的lib文件夾工作?
  2. 根據回答here,使用通用類加載器綁定驅動程序代碼會導致內存泄漏。如果屬實,解決方法是什麼?
+0

看這裏:http://stackoverflow.com/questions/21015991/jdbc-driver-has-been-forcibly-unregistered-by-tomcat-6/21016037#21016037 –

+0

tomcat的/ lib不適合你? –

+0

是的,它的確如此。但爲什麼不是web-inf/lib不工作 – John

回答

2

您的第一個問題的答案是您在第二個問題中引用的鏈接。這就是爲什麼您應該將JDBC驅動程序放入/lib。通常人們建議不要使用/lib,但JDBC驅動程序是一個很大的例外。

對於第二個問題,解決方法是將它放在Tomcat的shared/lib文件夾中。而已。那的修復。

+0

所以你的意思是,雖然在這種情況下使用shared/lib增加了內存泄漏的可能性,但這是唯一的解決方法? – John

+0

您的鏈接 - 您引用的另一個SO問題 - 說,「將JDBC驅動程序放入Tomcat的lib文件夾將有助於防止在重新部署Web應用程序時重新部署您的Web應用程序而不重新啓動Tomcat,例如,如果您只是將新的WAR文件放入Tomcat的webapps文件夾。 「所以這與你所說的完全相反。使用共享的'/ lib'會減少**內存泄漏的機會。 – dcsohl

+0

'/ lib'的缺點是系統中的所有WAR都必須使用相同版本的JDBC驅動程序。這是通常反對使用'/ lib'的一個重要原因,但對於JDBC而言,其收益大於成本。 – dcsohl

相關問題