方法 com/mysql/jdbc/PreparedStatement.isClosed()Z 是抽象的
Method com/mysql/jdbc/PreparedStatement.isClosed()Z is abstract
我正在尝试更改我的应用程序的连接池,以便使用 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) 但我仍然收到此错误。
连接池的创建方式如下:
首先,这在我的应用程序的 META-INF 目录中的 context.xml 文件中进行:
<?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 服务器 5.6
任何帮助将不胜感激
这都是错误的。你在养狗,自己在吠叫。首先,您不能使用 static Connections
,其次,使用 static 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
class。您可以通过注释将 DataSource
注入到您需要的任何地方。
我正在尝试更改我的应用程序的连接池,以便使用 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) 但我仍然收到此错误。
连接池的创建方式如下:
首先,这在我的应用程序的 META-INF 目录中的 context.xml 文件中进行:
<?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 服务器 5.6
任何帮助将不胜感激
这都是错误的。你在养狗,自己在吠叫。首先,您不能使用 static Connections
,其次,使用 static 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
class。您可以通过注释将 DataSource
注入到您需要的任何地方。