Метод com / mysql / jdbc / PreparedStatement.isClosed () Z является абстрактным - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь изменить пул соединений моего приложения, чтобы использовать пул соединений Tomcat (org.apache.tomcat.jdbc.pool) вместо «Apache Commons DBCP».

ОднакоЯ получаю эту ошибку при попытке подключиться к БД:

javax.servlet.ServletException: java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.isClosed()Z is abstract
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
...
...

Я читал в других ссылках, что обычно это проблема с версией драйвера MySQL-JDBC, однако я простообновлена ​​до последней версии Connector / J (mysql-connector-java-8.0.11.jar), но я все еще получаю эту ошибку.

Вот как создается пул соединений:

Во-первых, это относится к файлу context.xml в каталоге META-INF моего приложения:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource
    name="rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="10"
    minIdle="5"
    maxIdle="10"
    maxWait="10000"
    initialSize="2"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="true"
    minEvictableIdleTimeMillis="30000"              
    username="dbUser"
    password="dbPwd"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/rhweb2015"/>
</Context>

Затем у меня есть класс DBUtil.class, который используют все остальные библиотеки:

public class DBUtil {

    static Connection connection = null;
    static {
        try {
            Context context = new InitialContext();
            DataSource ds = (DataSource)context.lookup("java:comp/env/rhwebDB");
            connection = ds.getConnection();
        } catch (NamingException e) {
            System.out.println("DBUtil.NamingException" + e);
        } catch (SQLException e) {
            System.out.println("DBUtil.SQLException" + e);
        }
    }

    public static Connection getConnection() {
        return connection;
    }

    public static synchronized void closeConnection(Connection conn) {
        try {
            if (conn != null && !conn.isClosed())
                conn.close();
        } catch (SQLException sqle) {
            System.out.println("Error closing the connection ! " + sqle);
        }

    }
}

И, наконец, все остальные библиотеки Java используют пул соединений следующим образом:

public boolean someFunction( String myValue ){
    Connection conn = null;
    boolean fRetVal = false;

    String query = "select something from anytable";

    try {
        conn = DBUtil.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( query );

        if ( rs.next() )
            fRetVal = true;

        rs.close();
        stmt.close();

    } catch( SQLException ex ) {
            System.out.println(ex);
    }finally{
        DBUtil.closeConnection(conn);
    }

    return fRetVal;
}

Я что-то упустил?Я не получаю никаких ошибок при запуске Tomcat.

Версия JDK: 8 (версия Java "1.8.0_111") Версия Tomcat: 8.5.8 MySQL Server 5.6

Любая помощь будет действительноцениться

1 Ответ

0 голосов
/ 26 апреля 2018

Это все неправильно.Вы держите собаку и лаете сами.Вы не можете использовать статический Connections во-первых, а во-вторых, использование статического Connection сводит на нет всю цель использования пула соединений.Это должно быть примерно так:

public class DBUtil {

    static DataSource ds;
    static {
        try {
            Context context = new InitialContext();
            ds = (DataSource)context.lookup("java:comp/env/rhwebDB");
        } catch (NamingException e) {
            System.out.println("DBUtil.NamingException" + e);
        } catch (SQLException e) {
            System.out.println("DBUtil.SQLException" + e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

и, используя try-with-resources, чтобы закрыть все:

public boolean someFunction( String myValue ){
    boolean fRetVal = false;

    String query = "select something from anytable";

    try (Connection conn = DBUtil.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery( query )) {
        if ( rs.next() )
            fRetVal = true;
    } catch( SQLException ex ) {
        System.out.println(ex);
    }

    return fRetVal;
}

E & OE

Но учтите, что вы недействительно нужен класс DBUtil.Вы можете ввести DataSource где угодно, используя аннотацию.

...