суббота, августа 22, 2009

Jetty и ограничение размера POST-запросов

В Jetty по умолчанию стоит ограничение в размере 20000 байт на POST-запрос. Если этот объем превысить, обязательно получишь java.lang.IllegalStateException: Form too large NNNNNN>200000
Увеличивать объем можно разными способами, один из которых запускать java с установленным параметром org.mortbay.jetty.Request.maxFormContentSize:
java -Dorg.mortbay.jetty.Request.maxFormContentSize=12345
Другой способ, на мой взгляд более грамотный, это помещение в WEB-INF файла jetty-web.xml следующего содержания:
<?xml version="1.0"?>
          <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
          "http://jetty.mortbay.org/configure.dtd">

          <Configure id="WebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
                  <Set name="maxFormContentSize" type="int">6000000</Set>
          </Configure>

понедельник, августа 03, 2009

C3PO, PostGIS

Если нужно поработать с PostGIS с использованием пула C3PO будет полезным следующий синглтон


import java.lang.reflect.Method;
import java.sql.Connection;
import com.mchange.v2.c3p0.C3P0ProxyConnection;
import com.mchange.v2.c3p0.ComboPooledDataSource;


public class ConnectionPool {

private ComboPooledDataSource pooled;

private static class ConnectionPoolHolder {
private final static ConnectionPool instance= new ConnectionPool();
}

public static ConnectionPool getInstance() {
return ConnectionPoolHolder.instance;
}


private ConnectionPool() {

try {
Class.forName( "org.postgresql.Driver" );
pooled = new ComboPooledDataSource();
pooled.setDriverClass( "org.postgis.DriverWrapper");
pooled.setJdbcUrl( "jdbc:postgresql_postGIS://localhost/database" );
pooled.setUser("postgres");
pooled.setPassword("postgres");
} catch (Exception e) {
e.printStackTrace();
}
}

public Connection getConnection() {
Connection con = null;
try {
con = pooled.getConnection();
C3P0ProxyConnection castCon = (C3P0ProxyConnection) con;

//((org.postgresql.PGConnection) con).addDataType("geometry",org.postgis.PGgeometry.class) ;
//((org.postgresql.PGConnection) con).addDataType("box3d",org.postgis.PGbox3d.class);
// Do the same
Method m = org.postgresql.PGConnection.class.getMethod("addDataType", new Class[]{String.class, Class.class});
Object[] args = new Object[] {"geometry",org.postgis.PGgeometry.class};
castCon.rawConnectionOperation(m, C3P0ProxyConnection.RAW_CONNECTION, args);
Object[] args2 = new Object[] {"box3d",org.postgis.PGbox3d.class};
castCon.rawConnectionOperation(m, C3P0ProxyConnection.RAW_CONNECTION, args2);

} catch (Exception e) {
e.printStackTrace();
}
return con;
}

public static void closeConnection(Connection o)
{
try
{ if (o != null) o.close();}
catch (Exception e)
{ e.printStackTrace();}
}
}


Оно бы не стоило внимания, если бы C3PO давал напрямую работать с Connection, привести его тип к org.postgresql.PGConnection и добавить нужные типы методами PGConnection. Но C3PO дает прокси, у которого есть метод rawConnectionOperation, которому можно передать определение Method PGConnection и нужные аргументы.

Мой список блогов