2012-06-06 2 views
1

Я использую mysql-connector-java-5.1.20-bin.jar с jdk7 и tomcat7, но мой код дает abstractMethodError while . выполнение callableStatement.closeOnCompletion() код приведен ниже:Как обращаться с java.lang.AbstractMethodError: com.mysql.jdbc.JDBC4CallableStatement.closeOnCompletion()

попытки {

Session session = HibernateUtil.currentSession(); 
    CallableStatement st = session.connection().prepareCall(
    "{call getOfflineNodes('" + strDevice + "'," 
    + System.currentTimeMillis() + "," + polltime + ","+ status + ")}"); 
    ResultSet rs = st.executeQuery(); 
    Transaction tx = session.beginTransaction(); 
    st.closeOnCompletion(); 
    tx.commit(); 
    HibernateUtil.closeSession(); 
    return rs; 
} 

и полное исключение составляет:

java.lang.AbstractMethodError: com.mysql.jdbc.JDBC4CallableStatement.closeOnCompletion()V 
at com.clearcube.util.DMLLayer.getOfflineNodes(DMLLayer.java:90) 
at com.clearcube.logging.ShutBladeAlertService.<init>(ShutBladeAlertService.java:80) 
at com.clearcube.common.CMSServiceLoaderServlet.init(CMSServiceLoaderServlet.java:95) 
at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5015) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5302) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556) 
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
at java.util.concurrent.FutureTask.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

может кто-нибудь сказать мне, почему это исключение со и как справиться с этим.

код, где я использую это возвращается Resultset является:

timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() 
      { 
      String bladeMacs = ""; 
      String vmMacs = ""; 
      try 
      { 
       int poll = Integer.parseInt(
       ServerConfigurationService.getProperty("blade.refresh.time")); 

       Calendar callendar = Calendar.getInstance(); 

       String strblade = ""; 
       String strvm = ""; 
       String Ip = ""; 
       ResultSet BladeRs = (ResultSet)DMLLayer.getOfflineNodes(
       "Blade", poll, 1); 
       if (BladeRs != null) { 
       boolean isBladeAlive = false; 
       int x = 0; 
       try { 
        while (BladeRs.next()) { 

        String mac = BladeRs.getString("macAddress"); 
        String ip = BladeRs.getString("Ip"); 
        isBladeAlive = 
         EchoUDPClientDiscoveryObjectResponse.echo(InetAddress.getByName(BladeRs 
         .getString("Ip")), 6502, "any", 
         3, 500); 

        if (!isBladeAlive) { 

         if (x > 0) 
         { 
         strblade = strblade + "\n"; 
         bladeMacs = bladeMacs + "\n"; 
         } 

         strblade = strblade + ip; 
         x = 2; 
         bladeMacs = bladeMacs + mac; 
        } 
        else 
        { 
         String query = "update DiscoveredNode set DateModified=:DateModified where MacAddress=:MacAddress"; 

         ShutBladeAlertService.objTypeVector.removeAllElements(); 
         ShutBladeAlertService.objFieldVector.removeAllElements(); 
         ShutBladeAlertService.objValueVector.removeAllElements(); 

         ShutBladeAlertService.objTypeVector.add("Long"); 
         ShutBladeAlertService.objFieldVector.add("DateModified"); 
         ShutBladeAlertService.objValueVector.add(
         Long.valueOf(System.currentTimeMillis())); 
         ShutBladeAlertService.objTypeVector.add("String"); 
         ShutBladeAlertService.objFieldVector.add("MacAddress"); 
         ShutBladeAlertService.objValueVector.add(mac); 

         DMLLayer.runUpdateQuery(query, 
         ShutBladeAlertService.objFieldVector, ShutBladeAlertService.objValueVector, 
         ShutBladeAlertService.objTypeVector); 
        } 
        } 

        BladeRs.close(); 

       } 
       catch (Exception ex1) { 
        ex1.printStackTrace(); 
       } 

       } 
      } 
     } 

Спасибо заранее.

ответ

3

closeOnCompletion() существует с Java 7. И драйвер был реализован с предыдущей версией интерфейса. Таким образом, этот метод не реализован драйвером MySQL.

Найдите, существует ли более новая версия с поддержкой этого метода (но, похоже, она не существует), или не вызывайте этот метод.

+0

5.1.20 является последним драйвером, который я использую. Мне нужно вызвать этот метод, поскольку я использую resultSet, возвращенный из этой функции, в другую обработку кода. Есть ли другой способ закрыть вызываемый элемент после проверки количества открываемых наборов результатов. –

+0

Каждый мог использовать JDBC до того, как этот метод существовал, поэтому вы сможете это сделать. Вызовите все свои другие процессы, и когда они закончатся, закройте заявление. –

+0

Я не закрываю заявление после получения resultSet. Заявление закрывается автоматически, пока я обрабатываю resultSet и показываю следующее исключение; –

Смежные вопросы