Inhaltsverzeichnis
Update of TomEE to 7.02#
wget http://repo.maven.apache.org/maven2/org/apache/tomee/apache-tomee/7.0.2/apache-tomee-7.0.2-webprofile.tar.gz gunzip apache-tomee-7.0.2-webprofile.tar.gz tar
Tomcat init.d script#
This one from liferay seems to be quite ok.
See also Init.d | Guide from mulesoft
1. create a file /etc/init.d/<scriptname>:
#!/bin/bash # # tomcat This shell script takes care of starting and stopping Tomcat # # chkconfig: - 80 20 # ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $network $syslog # Required-Stop: $network $syslog # Default-Start: # Default-Stop: # Short-Description: start and stop tomcat ### END INIT INFO TOMCAT_USER=liferayapp TOMCAT_HOME="/opt/liferay/tomcat-7.0.27" SHUTDOWN_WAIT=45 tomcat_pid() { echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'` } start() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Tomcat is already running (pid: $pid)" else # Start tomcat echo "Starting tomcat" /bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/startup.sh" $TOMCAT_USER fi return 0 } stop() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Stoping Tomcat" /bin/su - -c "cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/shutdown.sh" $TOMCAT_USER let kwait=$SHUTDOWN_WAIT count=0 count_by=5 until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo "Waiting for processes to exit. Timeout before we kill the pid: ${count}/${kwait}" sleep $count_by let count=$count+$count_by; done if [ $count -gt $kwait ]; then echo "Killing processes which didn't stop after $SHUTDOWN_WAIT seconds" kill -9 $pid fi else echo "Tomcat is not running" fi return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) pid=$(tomcat_pid) if [ -n "$pid" ] then echo "Tomcat is running with pid: $pid" else echo "Tomcat is not running" fi ;; esac exit 02. Change ownerschip:
chmod 755 /etc/init.d/<scriptfile>3. register in init.d
update-rc.d <scriptfile> defaults 80 20
SQL setup and issues#
In one of my webapps I had the problem, that a simple SQL query could not be executed anymore the next day after the server was started.
91156451 DatePlanner201_JPA TRACE [http-bio-80-exec-9] openjpa.Query - Executing query: [SELECT x FROM DateGroup x where x.clientId = ?1] with parameters: {0=0} Jan 04, 2014 9:47:15 AM org.apache.geronimo.transaction.manager.TransactionImpl enlistResource WARNING: Unable to enlist XAResource org.apache.openejb.resource.jdbc.managed.local.LocalXAResource@6822098c, errorCode: 0 javax.transaction.xa.XAException: Count not turn off auto commit for a XA transaction at org.apache.openejb.resource.jdbc.managed.local.LocalXAResource.start(LocalXAResource.java:68) at org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource(TransactionImpl.java:209) at org.apache.openejb.resource.jdbc.managed.local.ManagedConnection.invoke(ManagedConnection.java:111) at com.sun.proxy.$Proxy130.prepareStatement(Unknown Source) [...] Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 69.695.505 milliseconds ago. The last packet sent successfully to the server was 69.695.505 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [...] Caused by: java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) [...] Jan 04, 2014 9:47:15 AM org.apache.openejb.core.transaction.EjbTransactionUtil handleSystemException SEVERE: EjbTransactionUtil.handleSystemException: Failed to execute query "SELECT x FROM DateGroup x where x.clientId = ?1". Check the query syntax for correctness. See nested exception for details. <openjpa-2.3.0-nonfinal-1540826-r422266:1542644 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Failed to execute query "SELECT x FROM DateGroup x where x.clientId = ?1". Check the query syntax for correctness. See nested exception for details. at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872) [...] Caused by: java.lang.reflect.UndeclaredThrowableException at com.sun.proxy.$Proxy130.prepareStatement(Unknown Source) [...] Caused by: javax.transaction.RollbackException: Transaction is marked for rollback at org.apache.geronimo.transaction.manager.TransactionImpl.registerSynchronization(TransactionImpl.java:154)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 41.371.723 milliseconds ago. The last packet sent successfully to the server was 41.371.723 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
Maybe it is due to this MySQL problem. => autoReconnect=true (?)
Tried also the option "defaultAutoCommit = false" and now additionally autoReconnectForPools=true.
Tomcat uses by default the transaction manager from Apache Commons DBCP. But there is obviously a better one, see Tomcat docu. You can set it with the "factory" entry.
This is my <tomee>/conf/tomee.xml now
Docu: Containers & Resources | Docu: DataSource Configuration | Docu: Transaction Manager | JDBC Pool Sizing | Docu: MySql Properties | Docu: MySQL Server Variables
<?xml version="1.0" encoding="UTF-8"?> <tomee> <Resource id="dp_Database" type="javax.sql.DataSource"> factory = org.apache.tomcat.jdbc.pool.DataSourceFactory jdbcDriver = com.mysql.jdbc.Driver jdbcUrl = jdbc:mysql://localhost:3306/dp connectionProperties = [autoReconnect=true,autoReconnectForPools=true] defaultAutoCommit = false userName = myuser password = mypassword poolPreparedStatements = true jtaManaged = true testOnBorrow = true validationQuery = SELECT 1 validationInterval = 30000 </Resource> <!-- not used anymore: <Resource id="dp_DatabaseUnmanaged" type="javax.sql.DataSource"> jdbcDriver = com.mysql.jdbc.Driver jdbcUrl = jdbc:mysql://localhost:3306/dp?autoReconnect=true connectionProperties = [autoReconnect=true,autoReconnectForPools=true] userName = myuser password = mypassword poolPreparedStatements = true jtaManaged = false </Resource> --> </tomee>
NOTE: If you do not specify a unmanaged datasource (jta=false), then Tomcat seems to create default one, see <tom>/logs/catalina.out!
The relation to the persistence.xml is
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="DatePlanner201_JPA"> <description>dp</description> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <jta-data-source>java:openejb/Resource/dp_Database</jta-data-source> <!-- not used anymore <non-jta-data-source>java:openejb/Resource/dp_DatabaseUnmanaged</non-jta-data-source> --> [...]
There are also some parameters in MySQL directly, called server variables. If you connect to mysql you can use
> SHOW VARIABLES; ==> wait_timeout 28800sec = 8h > set WAIT_TIMEOUT = ...;This was also a hint:
Also, make sure to set the following property on the MySQL datasource:
pinGlobalTxToPhysicalConnection="true"
I noticed another execption in the log.
387603 DatePlanner201_JPA INFO [http-bio-80-exec-7] openjpa.Runtime - Starting OpenJPA 2.2.2 387749 DatePlanner201_JPA INFO [http-bio-80-exec-7] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.MySQLDictionary" (MySQL 5.1.72-0ubuntu0.10.04.1 ,MySQL Connector Java mysql-connector-java-5.1.27 ( Revision: alexander.soklakov@oracle.com-20131021093118-gtm1bh1vb450xipt )). 387993 DatePlanner201_JPA WARN [http-bio-80-exec-7] openjpa.Enhance - An exception was thrown while attempting to perform class file transformation on "ebel.dp201.jpa.PropValueId":java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:156) at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:126) at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:290) at org.apache.openejb.persistence.PersistenceUnitInfoImpl$PersistenceClassFileTransformer.transform(PersistenceUnitInfoImpl.java:324) [...]This should be solved with a new OpenJPA version, see here
So I replaced the original jar file shipped with TomEE 1.6 Webprofile
<tomee>/lib/openjpa-2.3.0-nonfinal-1540826.jarwith the nightly built
<tomee>/lib/openjpa-2.4.0-20131106.135303-5.jar
Note: The currently stable version openjpa-2.2.2.jar does not work with TomEE. You may receive following error:
Jan 04, 2014 11:59:49 AM org.apache.geronimo.transaction.manager.TransactionImpl beforeCompletion WARNING: Unexpected exception from beforeCompletion; transaction will roll back <openjpa-2.2.2-r422266:1468616 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2008) at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527) [...] Caused by: java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:926)