2016-12-19 102 views
3

我正在將一個Web應用程序(WAR)部署到Tomcat 8 Web容器。在Tomcat 8上使用jTDS JDBC驅動程序的AbstractMethodError

戰爭在 '/ WEB-INF/lib' 目錄下包括以下JTDS JDBC驅動:

<dependency org="net.sourceforge.jtds" name="jtds" rev="1.3.1" /> 

(文件是:jtds-1.3.1.jar)。

這是資源如何在META-INF/context.xml定義:

<Resource name="jdbc/jtds/sybase/somedb" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="net.sourceforge.jtds.jdbc.Driver" 
      url="jdbc:jtds:sybase://localhost:2501/somedb" 
      username="someuser" password="somepassword" 
/> 

在我的代碼獲得javax.sql.DataSource正常方式:

InitialContext cxt = new InitialContext(); 
if (cxt == null) { 
    throw new RuntimeException("Uh oh -- no context!"); 
} 
DataSource ds = (DataSource) cxt.lookup(lookupName); 

我進一步驗證(通過印刷),該數據源對象ds屬於預期類型:

org.apache.tomcat.dbcp.dbcp2.BasicDataSource 

&hellip;但是當我試圖從中得到一個連接:

Connection conn = ds.getConnection(); 

&hellip;我得到以下跟蹤:

java.lang.AbstractMethodError 
net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833) 
org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:924) 
org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:282) 
org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:359) 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2316) 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2299) 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2043) 
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543) 

什麼給?

回答

8

原來我不得不補充:

validationQuery="select 1" 

在資源聲明中context.xml

這是提到的here(儘管拼寫爲validateQuery)。

挖掘到JtdsConnection一個實行看到:

/* (non-Javadoc) 
* @see java.sql.Connection#isValid(int) 
*/ 
public boolean isValid(int timeout) throws SQLException { 
    // TODO Auto-generated method stub 
    throw new AbstractMethodError(); 
} 

這是很奇怪的,我認爲是AbstractMethodError據稱由編譯器只拋出,未實現的方法應該拋出UnsupportedOperationException。無論如何,從PoolableConnection下面的代碼說明爲什麼validationQuerycontext.xml的存在與否可以改變的事情:

public void More ...validate(String sql, int timeout) throws SQLException { 
    ... 
    if (sql == null || sql.length() == 0) { 
     ... 
     if (!isValid(timeout)) { 
      throw new SQLException("isValid() returned false"); 
     } 
     return; 
    } 
... 
} 

所以基本上如果沒有validationQuery存在,那麼連接自己的執行isValid被諮詢這在奇怪地拋出JtdsConnection的案例AbstractMethodError

1

上述答案有效。如果您正在爲獨立Java應用程序進行設置,請在數據源中設置驗證查詢。

BasicDataSource ds = new BasicDataSource(); 

ds.setUsername(user); 
ds.setPassword(getPassword()); 
ds.setUrl(jdbcUrl); 
ds.setDriverClassName(driver); 
ds.setMaxTotal(10); 
ds.setValidationQuery("select 1"); //DBCP throws error without this query 
1

當我遇到這個問題時,Marcus上面提到的答案爲我工作。爲了讓的validationQuery設置是如何看在context.xml文件一個具體的例子:

<Resource name="jdbc/myDB" auth="Container" type="javax.sql.DataSource" 
      driverClassName="net.sourceforge.jtds.jdbc.Driver" 
      url="jdbc:jtds:sqlserver://SQLSERVER01:1433/mydbname;instance=MYDBINSTANCE" 
      username="dbuserid" password="dbpassword" 
      validationQuery="select 1" 
      /> 

的validationQuery設置進入與每個驅動程序設置爲你的數據庫連接。因此,每次將另一個數據庫條目添加到context.xml文件時,都需要將此設置與驅動程序設置一起使用。

相關問題