Tomcat, installation / configuration 6.0.18 with Sun, connection with Oracle db.

Never worked before with Tomcat, but an application-release needed to be upgraded from the old Tomcat 4.x to a higher level. So why not 6.0.18 with the latest Java, on Suse 10.1, 64-bits. How hard can it be?

Somewhat different than Oracle application server, but what the hack. With thanks to Timo Schijf, developer.

1. Download Tomcat 6.0.18 : http://tomcat.apache.org/download-60.cgi

- Core (tar.gz)

- Deployer (tar.gz) don’t know why yet, may come in convenient.

2. Unpack/install Tomcat (user Oracle):

- gunzip apache-tomcat-6.0.18.tar.gz AND “tar xvf apache-tomcat-6.0.18.tar” , instantly sub-directory created: apache-tomcat-6.0.18

- gunzip apache-tomcat-6.0.18-deployer.tar.gz AND “tar xvf apache-tomcat-6.0.18-deployer.tar” instantly sub-directory created: apache-tomcat-6.0.18-deployer

Now we need Java. Could have picked the existing one, 1.4.2 in an Oracle-home, or for an Java-RPM from Suse Linux.

Chosen for an independent installation – Sun -, so I don’t have to mess with other existing versions of Java on this system.

3. Download Sun-Java 6.11 or 6.13: http://www.java.com – in this case the 64-bits self-extracting file.

Install 6.1X ==> chmod a+x jre-6u11-linux-x64-rpm.bin AND ./jre-6u11-linux-x64-rpm.bin (and answer ‘yes’ for the terms)

Will be installed in directory /usr/java –> ls -al /usr/java/jre1.6.0_11  or /usr/java/jre1.6.0_13

Modify the Tomcat startup / shutdown file ( apache-tomcat-6.0.18/bin/startup.sh and ../shutdown.sh):

Put somewhere in top:

- for 6.11 : JAVA_HOME=/usr/java/jre1.6.0_11

export JAVA_HOME

- for 6.13 : JRE_HOME=/usr/java/jre1.6.0_13

export JRE_HOME

start it : ./start.sh The output must look something like this:

~/apache-tomcat-6.0.18/bin> ./startup.sh

Using CATALINA_BASE: /home/oracle/apache-tomcat-6.0.18

Using CATALINA_HOME: /home/oracle/apache-tomcat-6.0.18

Using CATALINA_TMPDIR: /home/oracle/apache-tomcat-6.0.18/temp

Using JRE_HOME: /usr/java/jre1.6.0_11

Going down, like this:

~/apache-tomcat-6.0.18/bin> ./shutdown.sh

Using CATALINA_BASE: /home/oracle/apache-tomcat-6.0.18

Using CATALINA_HOME: /home/oracle/apache-tomcat-6.0.18

Using CATALINA_TMPDIR: /home/oracle/apache-tomcat-6.0.18/temp

Using JRE_HOME: /usr/java/jre1.6.0_11

Running processes:

~/apache-tomcat-6.0.18/conf> ps -ef |grep catal

oracle 1962 1 0 12:29 pts/3 00:00:00 /usr/java/jre1.6.0_11/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/home/oracle/apache-tomcat-6.0.18/conf/logging.properties -Djava.endorsed.dirs=/home/oracle/apache-tomcat-6.0.18/endorsed -classpath :/home/oracle/apache-tomcat-6.0.18/bin/bootstrap.jar -Dcatalina.base=/home/oracle/apache-tomcat-6.0.18 -Dcatalina.home=/home/oracle/apache-tomcat-6.0.18 -Djava.io.tmpdir=/home/oracle/apache-tomcat-6.0.18/temp org.apache.catalina.startup.Bootstrap start

Real check:

http://<nodename><domain:8080 –> you should see the main page of tomcat, with on-board documentation.

Default port = 8080, defined in <tomcat-home>/conf/server.xml. Looks like: port=”8080″ protocol=”HTTP/1.1″

4. Jdbc driver: as we connect to Oracle, we need a JDBC-driver – put Ojdbc14.jar in the directory apache-tomcat-6.0.18/lib.

5. Connection pooling. To configure this, you may put this in the /META-INF/context.xml file.

5.1 Example context.xml:

<?xml version=”1.0″ encoding=”UTF-8″?>

<Context path=”/myapp”>

<!– maxActive: Maximum number of dB connections in pool. Make sure you

configure your mysqld max_connections large enough to handle

all of your db connections. Set to 0 for no limit.

–>

<!– maxIdle: Maximum number of idle dB connections to retain in pool.

Set to -1 for no limit.  See also the DBCP documentation on this

and the minEvictableIdleTimeMillis configuration parameter.

–>

<!– maxWait: Maximum time to wait for a dB connection to become available

in ms, in this example 10 seconds. An Exception is thrown if

this timeout is exceeded.  Set to -1 to wait indefinitely.

–>

<!– username and password: dB username and password for dB connections  –>

<!– driverClassName: Class name for the  JDBC driver.

–>

<!– url: The JDBC connection url for connecting to your MySQL dB.

The autoReconnect=true argument to the url makes sure that the

mm.mysql JDBC Driver will automatically reconnect if mysqld closed the

connection.  mysqld by default closes idle connections after 8 hours.

–>

<!– logAbandoned, removeAbandoned, removeAbandonedTimeout: Control whether

the container will prevent connection pool leaks by automatically removing

Connection, Statement, ResultSet, etc. objects that haven’t been closed

–>

<Resource name=”myDatabaseLink” auth=”Container”

maxActive=”100″ maxIdle=”30″ maxWait=”10000″

username=”<username>” password=”<password>”

driverClassName=”oracle.jdbc.driver.OracleDriver”

<!–url=”jdbc:mysql://localhost:3306/veilingdb?autoReconnect=true”

url=”jdbc:oracle:thin:@<domain>:1521:<dbname>?autoReconnect=true”

logAbandoned=”true” removeAbandoned=”true”

removeAbandonedTimeout=”60″ type=”javax.sql.DataSource” />

</Context>

5.2 Create a “Connection Pool”-class by the developer

Name of the datasoure must match the name in de context.xml above (here: myDatabaseLink).

Example:

package db;

import java.sql.Connection;

import java.sql.SQLException;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class ConnectionPool {

private static ConnectionPool pool = null;

private static DataSource dataSource = null;

public static synchronized ConnectionPool getInstance() {

if (pool == null) {

pool = new ConnectionPool();

}

return pool;

}

private ConnectionPool() {

try {

InitialContext ic = new InitialContext();

dataSource = (DataSource)ic.lookup(“java:/comp/env/myDatabaseLink”);

} catch (Exception e) {

e.printStackTrace();

}

}

public Connection getConnection() {

try {

return dataSource.getConnection();

} catch (SQLException e) {

e.printStackTrace();

return null;

}

}

}

5.3 To avoid problems with open connections the developer has to close the Resultset, statement and connection in the code after use.

Example how to use this in the code:

public static ArrayList<String> getArtikel(int ..Id) throws Exception {

ArrayList<String> row = new ArrayList<String>();

ResultSet rs = null;

PreparedStatement ps = null;

try {

ConnectionPool pool = ConnectionPool.getInstance();

Connection con = pool.getConnection();

ps =

con.prepareStatement(“select * from .. where id = ?”);

artikel.setInt(1, ..Id);

rs = artikel.executeQuery();

while (rs.next()) {

row.add(String.valueOf(rs.getInt(1)));

}

if (rs != null)

rs.close();

if (ps != null)

ps.close();

if (con != null)

con.close();

} catch (SQLException sqlex) {

System.out.println(“Fout in artikelen : ” + ” / ” + sqlex);

sqlex.printStackTrace();

System.exit(1);

} finally {

try {

// Close the resultset, statement and connection objects.

if (rs != null)

rs.close();

if (ps != null)

ps.close();

if (con != null)

con.close();

} catch (Exception ex) {

System.out.println(“Exception encountered: ” +

ex.getMessage());

ex.printStackTrace();

}

}

// Return the arraylist.

return row;

}

6. Deploying.

Most simple deployment method: make a .war-file and put it in /webapps:

6.1 Make a .war-file in Jdeveloper.

- Go to the Resources-folder of the project.

- Right click on webapp.deploy

- Choose option ‘deploy to WAR-file’

6.2 Make a .war-file in Eclipse.

- Go to the web-project-folder

- Right click on the folder.

- Choose export.

- Choose WAR-file en ‘next’

Put this in the directory /webapps from Tomcat. Tomcat will create a folder with the name of the project and unpack the .war-file.