This release was built with Java 7 and compiler settings for Java 6 source/target compatibility. Although the 3.9 is deprecated, this should allow existing customers on 3.9.x some breathing room to upgrade to a more recent release. New releases of 3.9.x will no longer be made with Java 6 (unlike before) so some testing is recommended if you are still on 3.9.x and/or Java 6.
We now log more context in case of timeouts: the coordinator ID and the stack trace of the application thread - making it easier to detect blocking situations that make the transaction time out.
The warning message for transactions marked as rollback-only was confusing since it suggested timeout as the cause, whereas this situation also happens on errors during the pre-commit phase. This has now been improved.
Some people complained about us logging to System.out when init-ing the logging subsystem, like this:
No org.slf4j.impl.StaticLoggerBinder found in ClassPath, trying with log4j2... No org.apache.logging.log4j.Logger found found in ClassPath, trying with log4j...
This has now been fixed: we no longer log to System.out in that case.
These methods have been implemented in a more efficient manner which should improve performance.
We no longer fill in the nested stack trace when throwing this exception, which should optimise performance with Spring message listener contains.
We've optimised the creating of proxy objects by smarter class loading.
We now try to avoid isSameRM calls when possible.
This release is for customers only. Not a customer yet? No problem, request a quote here:
We've refined a previous fix to catch Throwable rather than Exception - to tolerate differences in non-compliant JDBC driver behaviour.
In some (rare) cases there would be a deadlock on multithreaded JMS connection use. This has been fixed.
Added automatic detection of Log4j2 in the classpath
The more exotic TMJOIN behaviour is now disabled when setting supportsTmJoin=false on the AtomikosDataSourceBean class. This increases compatibility with SQLServer and also increases performance for transactions that have multiple statements going to the backend with "aggressive connection release" in ORM tools like Hibernate.
When the JDBC driver does not support the isClosed method then the list of open statements will keep growing in the AbstractConnectionProxy class. This in turn will lead to expensive and useless iterating over an ever-growing list of statements for every statement being created. This is bad for performance and causes up to 80% of the execution time being spent in the purging method doing useless iterations.
We now stop trying as soon as the isClosed call throws any exception. While the list of statements still keeps growing, we at least avoid iterating uselessly.
MSDTC creates "orphaned" resources on the XAConnection when TMJOIN is used. With a lot of these, the MSDTC server can crash. You can now avoid this by setting supportsTmJoin=false on the AtomikosDataSourceBean.
Fixed a bug where this filter could init the transaction core - thereby preventing application-specific initialisation overrides via our API.
A specific usage pattern of our datasource (ds) may involve:
//start transaction Connection c = ds.getConnection(); //DB Access 1: do stuff c.close() c = ds.getConnection(); //DB Access 2: do more stuff c.close() //commit transaction
By default, DB Access 2 will reuse the XA branch started by DB Access 1, via the TMJOIN flag (XA-specific). It should be possible to disallow TMJOIN and connection recycling when the database does not support it (like SQLServer).
The connection pool can retrieve/check this from the configured datasource properties before deciding to recycle a connection. This will effectively avoid TMJOIN, and DB Access 2 will use a new, different XA branch.
Highlights for how to make this work with SQLServer in terms of AtomikosDataSourceBean setup:
ds.setStartNewXaBranchFlags(SQLServerXAResource.SSTRANSTIGHTLYCPLD); ds.setSupportsTmJoin(false);
Fixed release 3.9.28 compatibility with JDBC drivers lower than JDBC4.
Install this fix if you have memory problems due to long transactions with many statements that exhaust RAM.
Our connection proxy keeps a list of pending statements so they can be closed automatically when needed. By default, this would also include statements that are already closed by the application. This causes needless memory usage overhead, and has now been fixed: statements that were closed by the application are purged from the list of pending statements.
Upgrade to this version if you have memory problems due to long transactions with many JDBC statements.
WARNING: do NOT upgrade if your JDBC driver is not JDBC 4 compliant.
Removed unnecessary synchronisation overhead to optimize performance.
During an earlier fix for case 102827 in release 3.7.8 (connection leak for errors during XAResource.end), we disabled throwing exceptions originating from XAResource.end, assuming that XAResource.prepare would subsequently refuse to prepare or commit the Xid in question. It turns out that there was a problem with this assumption and the way it was implemented in the code, which caused this issue. This has been fixed, and of course we've added a test to prevent future regression.
There was a bug in removing obsolete sessions, caused by incompatibility of the equals method and dynamic proxies. This has now been fixed.
initConnectionSql. When set, the connection pool will trigger the specified SQL when a new connection is added to the pool.
It is now possible to use Hazelcast distributed caching as part of your transactions. If there is a rollback then any changes in the cache will rollback too. This is useful if you want to keep your cache consistent with your messaging and/or database, and it reduces the need for manual evicting from the cache.
This functionality has been tested against Hazelcast 3.5, which also includes XA support. Nevertheless, for recovery purposes you still need Atomikos functionality, covered in this release.
Some primitive types were as yet unsupported, like long / byte / floating point / char. Support for these has now been added.
Under certain circumstances, closing a connection twice could affect intermediate reuse from the pool. This has now been fixed.
Non-XA participants could not be deserialised from the logs without this extra dependency.
Our write-ahead module contained an obsolete license check that prevented it from working with recent customers who no longer have/need license files in their installation.
Our log utility now also shows statistics on the average byte size of log entries.
The configuration details to allow JMX-level changes of the log level have been added to the spring JMX example and to the wiki documentation.
The LogUtil application now also shows any heuristic messages.
When warnings are not appropriate, commit-level are logged is INFO anyway - to allow diagnosing the details by our support team.
Exceptions are now treated without warnings when possible - as in case 135274 and case 135291 and case 135290.
We now log a warning only if the maxPoolSize equals the default (rather than the minPoolSize).
Avoid useless log warnings and stack traces if there are errors on commit that are not anomalies in the transaction outcome.
During 1-phase commit, some JMS brokers (ActiveMQ and other?) sometimes fail to recognise the Xid being committed. Instead of raising a needless heuristic (hazard) exception, this is now treated as internal timeout/rollback in the resource, and merely yields a RollbackException instead.
This is important when used with Spring's message listener containers because Spring will attempt to commit if there is no message on the queue, leading to a 1-phase commit where this can happen.
To improve the interpretation of the output of our LogUtil, it helps if extra details are shown - so the toString() method now returns output like this:
XAResourceTransaction: 7075626C697368657230303030313030303031:7075626C69736865723131 [IN_DOUBT in resource amq1]
It is now possible to call Object methods on connections after they were closed.
We now offer the AtomikosApplicationContextAware class in package com.atomikos.spring to automate the init and close ordering of your Atomikos Spring beans. It automates the correct init and shutdown ordering of your Atomikos beans, freeing you from the need to specify explicit and brittle depends-on bean dependencies, as well as init and destroy methods. To use this feature, simply add an instance of com.atomikos.spring.AtomikosApplicationContextAware to your Spring config…
Fixed cleanup of resources when writing a new epoch file, to avoid exceptions under abnormal operating conditions.
If two or more databases are involved, and all DBMS transactions are readonly, then the connections are not returned to the pool because Synchronization callbacks are not done properly. This has been fixed.
Fixed a NPE condition where concurrent borrow requests and close operations on existing sessions would interfere.
Fixed the Tomcat demo so it works out-of-the-box.
The documentation was disabled in the last few releases because of build issues - this has now been fixed.
We previously excluded the new Tomcat demo because it made the release process fail. This is now fixed.
Fixed a deadlock condition when multiple threads use the same JMS connection, each in its own session.
Exceptions during 1-phase commit used to generate useless retries and heuristic transaction outcomes. Since there is nothing that can be traced or retried anyway, we now ignore and log such cases.
Transactions with only 1 participant (or resource) will resort to 1-phase commit and there is no way to recover their state. Therefore, logging adds useless overhead and is now avoided.
We now try to avoid unnecessary and annoying HeuristicHazard outcomes and dito retries, by doing extra checks in the XAResource backend whenever possible.
We now support built-in tomcat integration as follows:
Tuned class loading to fix warnings related to case 116504 (JMX + OSGi compatibility)
Tomcat integration is facilitated by allowing multiple property values to be set as a CSV list in a String expression.
License checks are now disabled - this commercial value-added module is only available to paying subscribers and no longer for evaluation.
Fixed a minor bug where a stack trace would be displayed during class loading attempts:
java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder not found by com.atomikos.transactions-osgi [129]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at com.atomikos.util.ClassLoadingHelper.loadClass(ClassLoadingHelper.java:123)
at com.atomikos.logging.LoggerFactory.<clinit>(LoggerFactory.java:25)
at com.atomikos.transactions.internal.AtomikosActivator.<clinit>(AtomikosActivator.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4177)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1972)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)
at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeatures(FeaturesServiceImpl.java:479)
at org.apache.karaf.features.internal.FeaturesServiceImpl$2.run(FeaturesServiceImpl.java:1150)
No org.slf4j.impl.StaticLoggerBinder found in ClassPath, trying with log4j...
We've improved support for short properties that need to be converted from a text/XML configuration file.
The UserTransactionManager class has a class-level synchronized block used for init purposes. We've added extra checks so this block is only executed if really needed. This optimizes performance by limiting the number of cases where threads will block each other.
We've added a reset of the underlying ObjectOutputStream for serialized logging, to avoid high memory consumption when the JDK keeps pointers to all previously serialized objects since the last checkpoint.
Fixed a critical bug where errors on delist would cause connection pool exhaustion.
Empty, committing transactions would needlessly generate logging overhead and also generate needless heuristic warnings upon recovery. This has now been fixed. For the original report, see this forum post.
Committing 1PC transactions would be converted to heuristic hazard cases upon recovery, which is in fact incorrect because these will then undergo 2PC commit retry. This has now been fixed: committing 1PC transactions are now simply forgotten upon recovery.
Improved synchronization to avoid race conditions while checking whether or not a connection is taking part in a transaction. Also see this report in the forums.
Fixed polluting Mockito dependency in the poms.
Removed top-level folders that make unzipping to artifactory impractical.
Improved logging during init of the connection pool.
We now avoid generating too much log content for timeouts.
Fixed a condition where recovery could lead to out-of-memory errors.
The logging noise in JDBC has been reduced significantly.
Added warning to the log if prepare yields errors.
The new 'propagateJtaTimeoutToXaResource' configuration property for JDBC and JMS now allows you to disable timeouts propagate via XA. For some vendor's XAResoure implementations this timeout seems to give problems and this property can serve as a workaround.
Vendor-specific flags for starting a new XA branch as well as joining/suspending/resuming/ending an existing branch are now supported on the JDBC and JMS connector classes.
The new property 'xaPropertyNamesToHide' allows you to specify what vendor-specific XA properties should be hidden in the log entries. Typically, this would be used for sensitive information like passwords.
Improved handling of class loading to be consistent in OSGi with the rest of the code base.
Fixed JMX to work in OSGi too.
Added warning to the log if prepare yields errors.
This should make out-of-the-box integration with Tomcat and Spring easier.
Improved the way that unexpected errors are dealt with: the connections should be closed in those cases also.
Improved behavior after close: only begin() now throws an exception. The other JTA methods are allowed to proceed with the intention of maximizing the chance of clean shutdown.
Removed synchronization issues among concurrent threads that could cause a deadlock.
This should now also be fixed.
Fixed a deadlock situation during shutdown.
Checking for enlisted XAResources has been relaxed to allow more use cases than before.
Fixed a bug where hazard XA branches could not terminate due to connectivity failures after restart.
Improved the way recovery diagnoses itself - to avoid unnecessary log warnings.
This has been fixed.
The logging noise in JDBC has been reduced significantly.
Added warning to the log if prepare yields errors.
Improved shutdown procedure to wait for any listener threads to exit first. This should avoid ugly shutdown warnings and improve overall shutdown.
It is now possible to specify an (optional) extra receiveTimeout property - which will speed up shutdown because blocked receiver threads will exit sooner if a value is specified lower than the transaction timeout.
Corrected NullPointerException bug on recovery of certain transaction states.
Added workaround for MQSeries memory leak when connectivity to the broker goes down.
We now log a warning if a connection pool is shutdown while some connections are still being used.
Fixed a bug where two subsequent getConnection() requests (by the same thread) would get the same connection from the same AtomikosConnectionFactoryBean - leading to problems with the later close logic.
Improved the retry/refresh logic when the JMS backed is unreachable.
When using the sendXXX utility methods of the sender template, one would get exceptions if only the destinationName (not the destination itself) had been set. This has now been fixed.
Fixed a bug where closing a JMS session would also close the underlying vendor session, leading to problematic rollback/commit.
Improved logging of non-recoverable coordinators to help diagnose problems.
From now on, setting com.atomikos.icatch.threaded_2pc=false will also change the way the timeout mechanism behaves: active transactions will no longer be rolled back by the timeout thread, but rather set to rollbackOnly instead. Other transaction states are not affected.
Corrected the documentation: removed obsolete references to folders that no longer exist in the 3.7 release.
Corrected the link to the Atomikos team page in the release documentation.
This bug has now been fixed.
Ported fix for case 80464 - error on shutdown of MessageDrivenContainer.
Ported fix for case 83599: MessageDrivenContainer - add receiveTimeout property.
Removed obsolete reference to OraXidFactory in the docs.
Added the RMI examples - missing in the 3.7.0 release.
The transactions-writeahead logging module is now a fragment bundle for OSGi - it can be added to the bundles of your OSGi runtime. If present, it will be picked up automatically for the logging.
When a valid license is found, this is now shown in the logs as INFO message.
Resolved an issue where in some cases the JmxTransactionManagerBean might not be initialized properly.
We now avoid generating too much log content for timeouts.
For release 3.9.1, the examples could not be uploaded to the website. This should now have been fixed.
Some newer modules (atomikos-licensing and transactions-jmx) were not yet enabled for OSGi; this is fixed and illustrated with new OSGi examples.
Due to changes for compatibility with our new commercial functionality, the OSGi demos are no longer part of the open source demos.
This setting got ignored in the 3.9 release, meaning there was no way to turn logging off - this has now been fixed.
The evaluation download contained old release notes - these have been removed. Release notes are now online only.
The new transactions-jmx was missing in the zip file for the evaluation download.
You can now also register listener instances via the JDK ServiceLoader mechanism.
A JTA-specific import (on heuristic exceptions) existed in our Participant interface - this is now removed.
Unless the AtomikosConnectionFactoryBean is set to use localTransactionMode, we now always create XA-capable sessions. This facilitates compatibility with third-party platforms like Spring.
A new transaction MBean now supports easier viewing of active transactions, as well as important transaction statistics and counters (like percent committed, percent aborted and so on).
It is now possible for internal or external modules (using transactions-api) to register for important life cycle events involving transaction and connection pool states, like transaction creation, commit, rollback or heuristic outcomes. See the com.atomikos.icatch.event package and its interaction with the ServiceLoader mechanism in Java.
The licensing framework has been refactored to use signed public/private key technology. A new license consists of 2 files: a property file and a signature file, both of which need to be added to the class path of your application (or, alternatively, put in some folder whose location is specified as system property 'com.atomikos.license_folder'). Also, the default 30 minute evaluation license has been removed from ExtremeTransactions.
Added/improved JMX support for JDBC and JMS in ExtremeTransactions.
We've improved support for short properties that need to be converted from a text/XML configuration file.
Fixed return type of the getParentLogger method.
Fixed a critical bug where errors on delist would cause connection pool exhaustion.
See this forum post for details: JMX utility methods have been added to our ConnectionFactory.
Empty, committing transactions would needlessly generate logging overhead and also generate needless heuristic warnings upon recovery. This has now been fixed. For the original report, see this forum post.
The PDF guides are now downloadable as separate artifacts. This keeps the product release small and compliant with your maven repository, and shortens the build time for bug fixes.
Refactored these important classes - the code needed some cleaning...
JDBC statements are now logged with the SQL arguments.
The examples are now shipped as separate artifacts so the product distribution is minimal and maven-compliant for easy deployment to your repository, and shortens the build time for bug fixes.
When a JTA transaction is resumed by its thread, it will also trigger resume at the XA level for all enlisted XAResource instances.
Avoid the overhead of a testQuery by setting maxLifetime: this new property removes from the pool any connection that stays around longer than this limit. This closes your connections before any configuration-specific timeouts do, and mostly deprecates the need for a testQuery. This, in turn, improves performance of the pool because borrowing a connection no longer implies a roundtrip to the database (inside a synchronized block!).
When you register Synchronization instances then this will no longer imply / force 2-phase commit. This increases performance for use cases with only one XAResource, where the 1-phase commit optimization can now product its maximum efficiency.
The examples are now built and run with maven.
The transactions-jms-deprecated module/jar has been dropped.
The transactions-jdbc-deprecated module/jar has been dropped.
Improved the way getStatus() works.
Improved exception chaining so root causes are more visible.
Improved TMJOIN behavior so this feature can now be fully exploited at the XAResource level.
A new, alternative logging implementation is available. It avoids object serialization and can be activated by setting the init property com.atomikos.icatch.serializable_logging to false.
The commercial edition now contains a new module write-ahead logging for increased performance.
Another improvement of the way root causes are handled.
The afterCompletion method of synchronization instances no longer gets "UNKNOWN" for read-only transactions.
We no longer support Java 5 since it is deprecated anyway.