Ja, jeg har også benyttet war til deployment. Det gør det en del lettere. Her til morgen har jeg (igen igen) været ved at gennemsøge nettet efter mulige løsninger. Jeg har da også fundet lidt, som jeg har forsøgt at tage det interessante fra. Men altså vi snakker om en udskiftning af 20 linier kode, og +- 50 liniers kode ved siden af (til metoder f.eks.). Det interessante er så, at hidtil har war-filen fyldt en 60 MB. Og pludselig efter tilretningerne fylder den kun 15 MB. Det ser da mærkeligt ud. Og jsp-filerne ligger rigtigt nok deri, så måske er det nogle grafik-filer, som pludselig ikke er inkluderet i buildet.
Nå, men DatabaseHandler står blot for selve forbindelsen til databasen med tilhørende insert/update/delete-statements. Og så kan den returnere nogle resultsets.
ServletDatabase initialiserer DatabaseHandleren, og kan derved tilbyde de funktioner gennem nettet, som DatabaseHandleren stiller til rådighed.
Tekst i logfilerne er bl.a. System.out.println() fra min kode, så jeg kan følge lidt med i, hvad der sker under kørsel.
Jeg har nu ryttet gevaldigt op i server.xml, så den kun indeholder det mest grundlæggende (ligesom i det connectionPool-eksempel, jeg rent faktisk fik til at køre, men som blot var med test-database, og initialisering direkte fra jsp-siden).
Nu ser min main-kode ud som følger:
...
try {
InitialContext context = createContext();
String jndiName="jdbc/MySQLDB";
connection=getConnection();
//Establishes a connection pool that contains connections:
//ConnectionPoolDataSource dataSource2 = (ConnectionPoolDataSource) context.lookup(jndiName);
//PooledConnection pooledConnection = dataSource2.getPooledConnection();
} catch (Exception e) {
System.out.println("SetupJNDIDataSource err: " + e.getMessage());
e.printStackTrace();
}
statement=connection.createStatement();
rs3 = statement.executeQuery("select * from....
Og metoder er:
private Connection getConnection()
{
Connection connection = null;
try
{
InitialContext context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("jdbc/MySQLDB");
connection = dataSource.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
private static InitialContext createContext() throws NamingException {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
env.put(Context.PROVIDER_URL, "
rmi://localhost:1099");
InitialContext context = new InitialContext(env);
return context;
}
server.xml ser således ud:
<Context path="/Server" docBase="Server.war" debug="1" reloadable="true" crossContext="true">
<Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="clientUser" password="kode" driverClassName="com.mysql.jdbc.Driver" url="jdbc:
mysql://localhost:3306/databaseNavn" />
</Context>
Og en logfil fra TomCat ("stdout..."):
if the page is NOT postback then this is initialized
Is beginning MySql-initialization...
DatabaseHandler->ds= org.apache.tomcat.dbcp.dbcp.BasicDataSource@55d93d
javax.naming.NoInitialContextException: Cannot instantiate class: oracle.jdbc.pool.OracleDataSourceFactory [Root exception is java.lang.ClassCastException: oracle.jdbc.pool.OracleDataSourceFactory cannot be cast to javax.naming.spi.InitialContextFactory]
END connectionPool for MySql connection...
DatabaseHandler->Database created!
ServeltDatabase->proceesrequest
doDatabaseConnectionInitialization() BEGIN
ServletDatabase->doDatabaseConnectionInitialization:Exceptionnull
doDatabaseConnectionInitialization() END
ServletDatabase->at the end of processRequest
Done initialization now...
DONE getAttribute("rs")
Det ses klart ud fra denne log, at problemerne er ved oprettelse af database-forbindelsen, og naturligvis alle de gange, hvor der foretages operationer på denne.
Jeg går ud fra, at fejlen blot er en mindre, men vital, del af database-initiliaseringen. Jeg kan blot ikke se, hvor fejlen er.
En af de få steder, hvor jeg ikke er helt med på forståelsen her til morgen er koden "env.put(Context.PROVIDER_URL, "
rmi://localhost:1099");". Jeg har accepteret, at rmi åbenbart er en gyldig metode af bruge, men hvorfor der står localhost med portnummeret, er jeg ikke med på. Burde det ikke være det samme portnummer, som mysql stiller databasen til rådighed gennem? Altså 3306?
Al hjælp vil blive GEVALDIG påskønnet!