Pool de conexiones tomcat

Alejandro
11 de Julio del 2005
Buenas, estoy intentando usar un pool de conexiones. Estoy trabajando con Tomcat 4, mysql 5 y opencms 5.01. En el momento que intento recoger la conexion, me peta....el codigo es tal que asi:
public static Connection getConnectionStatic(String poolname)
{
Connection conn = null;
try
{
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)initContext.lookup(poolname);//.lookup("poolname");
conn = ds.getConnection();
}
catch(NamingException ne)
{
ne.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
return conn;
}
Al ejecutarse me dice que el nombre jdbc no existe en el contexto. Alguien me puede ayudar?

Jordi
11 de Julio del 2005
Yo utilizo una clase tal com asi
No tengo problemas con acceso DB.
public final class DBUtil {

private static Log log = LogFactory.getLog(DBUtil.class);

public static final int DATABASE_UNKNOWN = 0;
public static final int DATABASE_GENERAL = 1;
public static final int DATABASE_NOSCROLL = 2;

public static final int DATABASE_ORACLE = 10;
public static final int DATABASE_SQLSERVER = 11;
public static final int DATABASE_DB2 = 12;
public static final int DATABASE_SYBASE = 13;
public static final int DATABASE_IMFORMIX = 14;
public static final int DATABASE_MYSQL = 15;
public static final int DATABASE_POSTGRESQL = 16;
public static final int DATABASE_HSQLDB = 17;
public static final int DATABASE_ACCESS = 18;

private static int databaseType = DATABASE_UNKNOWN;


private static int minutesBetweenRefresh = 30;// 30 minutes
private static DataSource dataSource = null;

private static long lastGetConnectionTime = 0;

private static long lastCloseAllConnectionsTime = 0;

// static init of the class
static {




try {
//javax.naming.Context context = new javax.naming.InitialContext();
// sample data source = java:comp/env/jdbc/MysqlDataSource

Context ctx = new InitialContext();


dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/TestDB");
log.info("DBUtils : use datasource = " + "java:comp/env/jdbc/TestDB");
} catch (javax.naming.NamingException e) {
log.error("Cannot get DataSource: datasource name = " + "java:comp/env/jdbc/TestDB", e);
}

log.info("DBUtils inited.");
}

private DBUtil() {// so cannot new an instance
}

/**
* Use this method to get the database type. This method will automatically
* detect the database type. You could override this value by modifying
* the value in mvncore_db_DBOptions.properties
* @return : the database type
*/
public static int getDatabaseType() {
if (databaseType == DATABASE_UNKNOWN) {
Connection connection = null;
try {
connection = DBUtil.getConnection();
DatabaseMetaData dbmd = connection.getMetaData();
String databaseName = dbmd.getDatabaseProductName().toLowerCase();
if (databaseName.indexOf("oracle") != -1) {
databaseType = DATABASE_ORACLE;
} else if (databaseName.indexOf("sql server") != -1) {
databaseType = DATABASE_SQLSERVER;
} else if (databaseName.indexOf("mysql") != -1) {
databaseType = DATABASE_MYSQL;
} else if (databaseName.indexOf("postgresql") != -1) {
databaseType = DATABASE_POSTGRESQL;
} else if (databaseName.indexOf("hsql") != -1) {
databaseType = DATABASE_HSQLDB;
} else {
databaseType = DATABASE_GENERAL;
}
log.info("Auto detect DATABASE_TYPE = " + databaseType);
} catch (Exception ex) {
log.error("Error when running getDatabaseType", ex);
} finally {
DBUtil.closeConnection(connection);
}
}
return databaseType;
}

/**
* Get a connection from the connection pool. The returned connection
* must be closed by calling DBUtils.closeConnection()
* @return : a new connection from the pool if succeed
* @throws SQLException : if cannot get a connection from the pool
*/
public static Connection getConnection() throws SQLException {

long now = System.currentTimeMillis();
lastGetConnectionTime = now;
// now check if we have not close all connections to refresh
// after MINUTES_BETWEEN_REFRESH minutes, then will do it now
if (now - lastCloseAllConnectionsTime > DateUtil.MINUTE * minutesBetweenRefresh) {
boolean isBalance = closeAllConnections();
if (isBalance == false) {
try {
// wait for the checked-out connections to be returned and closed
Thread.sleep(2000);
log.debug("DBUtils: sleep 2 seconds for checked-out connections to returned and closed.");
} catch (Exception ex) { }
}
}

Connection conection = null;


if (dataSource != null) {
conection = dataSource.getConnection();
}



if (conection == null) {
throw new SQLException("DBUtil: Cannot get connection from Connection Pool.");
}
return conection;
}

/**
* Close all the connections that currently in the pool
* This method could be used to refresh the database connection
* @return true if the pool is empty and balance
* false if the pool has returned some connection to outside
*/
public static boolean closeAllConnections() {
log.debug("DBUtil.closeAllConnections is called.");
boolean retValue = true;// balance (default)
lastCloseAllConnectionsTime = System.currentTimeMillis();

if (dataSource != null) {
// do nothing here now
}


return retValue;
}

/**
* Use this method to return the connection to the connection pool
* Do not use this method to close connection that is not from
* the connection pool
* @param connection : the connection that needs to be returned to the pool
*/
public static void closeConnection(Connection connection) {
if (connection == null) return;


try {
connection.close();
} catch (SQLException e) {
log.error("DBUtil: Cannot close connection.", e);
}

}

/**
* Use this method to reset the MaxRows and FetchSize of the Statement
* to the default values
* @param statement : the statement that needs to be reseted
*/
public static void resetStatement(Statement statement) {
if (statement != null) {
try {
statement.setMaxRows(0); //reset to the default value
} catch (SQLException e) {
log.error("DBUtils: Cannot reset statement MaxRows.", e);
}

try {
statement.setFetchSize(0); //reset to the default value
} catch (SQLException sqle) {
//do nothing, postgreSQL doesnt support this method
}
}
}

/**
* Use this method to close the Statement
* @param statement : the statement that needs to be closed
*/
public static void closeStatement(Statement statement) {
try {
if (statement != null) statement.close();
} catch (SQLException e) {
log.error("DBUtil: Cannot close statement.", e);
}
}

/**
* Use this method to close the ResultSet
* @param rs : the resultset that needs to be closed
*/
public static void closeResultSet(ResultSet rs) {
try {
if (rs != null) rs.close();
} catch (SQLException e) {
log.error("DBUtil: Cannot close resultset.", e);
}
}

/*
public static void main(String[] args) {
//DBUtils DBUtils1 = new DBUtils();
//log.info("i = " + dataSource1);
}*/
}

Alejandro
11 de Julio del 2005
Jordi, antes que nada muchas gracias. Ahora viene la segunda pregunta. Como configuras tu el server.xml y el web.xml. Creo que el problema reside ahí. Yo esos dos ficheros no los toco, aunque creo que debería hacerlo. Me pasaron un fichero opencms.xml, con la configuracion del pool, pero me da a mi q deberia modificar esos dos ficheros.
SAludos