You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/10/22 13:35:41 UTC
tomee git commit: TOMEE-1643 ensure to close the XAConnection to not
leak connection or break the pool - dbcp this time
Repository: tomee
Updated Branches:
refs/heads/master 74bd06dd5 -> 7b7e630e0
TOMEE-1643 ensure to close the XAConnection to not leak connection or break the pool - dbcp this time
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/7b7e630e
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/7b7e630e
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/7b7e630e
Branch: refs/heads/master
Commit: 7b7e630e0150a8cf326465726c6cb9082b35556d
Parents: 74bd06d
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Thu Oct 22 13:35:32 2015 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Thu Oct 22 13:35:32 2015 +0200
----------------------------------------------------------------------
.../openejb/resource/jdbc/XAPoolTest.java | 120 +++++++++++++++++++
1 file changed, 120 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/7b7e630e/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XAPoolTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XAPoolTest.java b/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XAPoolTest.java
new file mode 100644
index 0000000..2ae7919
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/XAPoolTest.java
@@ -0,0 +1,120 @@
+/**
+ * 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.openejb.resource.jdbc;
+
+import org.apache.commons.dbcp2.BasicDataSource;
+import org.apache.commons.dbcp2.managed.ManagedConnection;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.resource.jdbc.dbcp.ManagedDataSourceWithRecovery;
+import org.apache.openejb.resource.jdbc.pool.DefaultDataSourceCreator;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.testng.PropertiesBuilder;
+import org.hsqldb.jdbc.pool.JDBCXAConnectionWrapper;
+import org.hsqldb.jdbc.pool.JDBCXADataSource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+public class XAPoolTest {
+ @Resource(name = "xadb")
+ private DataSource ds;
+
+ @Module
+ public EjbJar mandatory() {
+ return new EjbJar();
+ }
+
+ @Configuration
+ public Properties props() {
+ return new PropertiesBuilder()
+ .p("openejb.jdbc.datasource-creator", DefaultDataSourceCreator.class.getName())
+
+ .p("txMgr", "new://TransactionManager?type=TransactionManager")
+ .p("txMgr.txRecovery", "true")
+ .p("txMgr.logFileDir", "target/test/xa/howl")
+
+ // real XA datasources
+ .p("xa", "new://Resource?class-name=" + JDBCXADataSource.class.getName())
+ .p("xa.url", "jdbc:hsqldb:mem:dbcpxa")
+ .p("xa.user", "sa")
+ .p("xa.password", "")
+ .p("xa.SkipImplicitAttributes", "true")
+ .p("xa.SkipPropertiesFallback", "true") // otherwise goes to connection properties
+
+ .p("xadb", "new://Resource?type=DataSource")
+ .p("xadb.xaDataSource", "xa")
+ .p("xadb.JtaManaged", "true")
+ .p("xadb.MaxIdle", "25")
+ .p("xadb.MaxTotal", "25")
+ .p("xadb.InitialSize", "3")
+
+ .build();
+ }
+
+ @Test
+ public void check() throws SQLException {
+ assertNotNull(ds);
+ final BasicDataSource tds = ManagedDataSourceWithRecovery.class.cast(ds);
+
+ assertEquals(0, tds.getNumIdle()); // db not yet used so no connection at all (dbcp behavior)
+
+ try (final Connection c = ds.getConnection()) {
+ assertNotNull(c);
+
+ final Connection connection = c.getMetaData().getConnection(); // just to do something and force the connection init
+ assertThat(connection, instanceOf(ManagedConnection.class));
+ assertTrue(connection.toString().contains("URL=jdbc:hsqldb:mem:dbcpxa, UserName=SA, HSQL Database Engine Driver"));
+ } // here we close the connection so we are back in the initial state
+
+ assertEquals(0, tds.getNumActive());
+ assertEquals(3, tds.getNumIdle());
+
+ for (int it = 0; it < 5; it++) { // ensures it always works and not only the first time
+ final Collection<Connection> connections = new ArrayList<>(25);
+ for (int i = 0; i < 25; i++) {
+ final Connection connection = ds.getConnection();
+ connections.add(connection);
+ connection.getMetaData(); // trigger connection retrieving otherwise nothing is done (pool is not used)
+ }
+ assertEquals(25, tds.getNumActive());
+ assertEquals(0, tds.getNumIdle());
+ for (final Connection toClose : connections) {
+ toClose.close();
+ }
+ assertEquals(0, tds.getNumActive());
+ assertEquals(25, tds.getNumIdle());
+ }
+ }
+}
+
+