You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2008/11/16 04:26:29 UTC
svn commit: r717972 - in /tomcat/trunk/modules/jdbc-pool:
java/org/apache/tomcat/jdbc/pool/interceptor/
test/org/apache/tomcat/jdbc/test/
Author: fhanik
Date: Sat Nov 15 19:26:29 2008
New Revision: 717972
URL: http://svn.apache.org/viewvc?rev=717972&view=rev
Log:
Added an interceptor that keeps track of statements, and if they are not closed, then they will be closed automatically
Added:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java?rev=717972&r1=717971&r2=717972&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java Sat Nov 15 19:26:29 2008
@@ -37,15 +37,21 @@
public AbstractCreateStatementInterceptor() {
super();
}
-
+
+ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- boolean process = false;
- process = process(statements, method, process);
- if (process) {
- Object statement = super.invoke(proxy,method,args);
- return createStatement(proxy,method,args,statement);
+ if (CLOSE_VAL==method.getName()) {
+ closeInvoked();
+ return super.invoke(proxy, method, args);
} else {
- return super.invoke(proxy,method,args);
+ boolean process = false;
+ process = process(statements, method, process);
+ if (process) {
+ Object statement = super.invoke(proxy,method,args);
+ return createStatement(proxy,method,args,statement);
+ } else {
+ return super.invoke(proxy,method,args);
+ }
}
}
@@ -59,6 +65,8 @@
* @return
*/
public abstract Object createStatement(Object proxy, Method method, Object[] args, Object statement);
+
+ public abstract void closeInvoked();
protected boolean process(String[] names, Method method, boolean process) {
for (int i=0; (!process) && i<names.length; i++) {
Added: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java?rev=717972&view=auto
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java (added)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java Sat Nov 15 19:26:29 2008
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.pool.interceptor;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Method;
+import java.sql.Statement;
+import java.util.ArrayList;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+/**
+ * Keeps track of statements associated with a connection and invokes close upon connection.close()
+ * @author fhanik
+ *
+ */
+public class StatementFinalizer extends AbstractCreateStatementInterceptor {
+ protected static Log log = LogFactory.getLog(StatementFinalizer.class);
+
+ protected ArrayList<WeakReference<Statement>> statements = new ArrayList<WeakReference<Statement>>();
+
+ @Override
+ public Object createStatement(Object proxy, Method method, Object[] args, Object statement) {
+ // TODO Auto-generated method stub
+ try {
+ statements.add(new WeakReference((Statement)statement));
+ }catch (ClassCastException x) {
+ //ignore this one
+ }
+ return statement;
+ }
+
+ @Override
+ public void closeInvoked() {
+ while (statements.size()>0) {
+ WeakReference<Statement> ws = statements.remove(0);
+ Statement st = ws.get();
+ if (st!=null) {
+ try {
+ if (!st.isClosed()) {
+ st.close();
+ }
+ } catch (Exception ignore) {
+ if (log.isDebugEnabled()) {
+ log.debug("Unable to closed statement upon connection close.",ignore);
+ }
+ }
+ }
+ }
+ }
+
+}
Added: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java?rev=717972&view=auto
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java (added)
+++ tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java Sat Nov 15 19:26:29 2008
@@ -0,0 +1,25 @@
+package org.apache.tomcat.jdbc.test;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import org.apache.tomcat.jdbc.pool.DataSourceProxy;
+import org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
+
+public class StatementFinalizerTest extends DefaultTestCase {
+
+ public StatementFinalizerTest(String name) {
+ super(name);
+ }
+
+ public void testStatementFinalization() throws Exception {
+ DataSourceProxy d1 = this.createDefaultDataSource();
+ d1.setJdbcInterceptors(StatementFinalizer.class.getName());
+ Connection con = d1.getConnection();
+ Statement st = con.createStatement();
+ assertFalse("Statement should not be closed.",st.isClosed());
+ con.close();
+ assertTrue("Statement should be closed.",st.isClosed());
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org