This is a quick reiteration of key points found in the link below..
make sure you provide the GRANT for insert/select/update to the user you will
be using e.g.
mysql> GRANT ALL PRIVILEGES ON *.* TO [EMAIL PROTECTED]
-> IDENTIFIED BY 'javadude' WITH GRANT OPTION;
mysql> create database javatest;
mysql> use javatest;
mysql> create table testdata (
-> id int not null auto_increment primary key,
-> foo varchar(25),
-> bar int);
JDBC access...
I assume you have these resource statements either in applicationContext.xml or
server.xml
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/TestDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- 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.
-->
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<!-- Maximum number of idle dB connections to retain in pool.
Set to 0 for no limit.
-->
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<!-- 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.
-->
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<!-- MySQL dB username and password for dB connections -->
<parameter>
<name>username</name>
<value>javauser</value>
</parameter>
<parameter>
<name>password</name>
<value>javadude</value>
</parameter>
<!-- Class name for mm.mysql JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<!-- 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.
-->
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/javatest?autoReconnect=true</value>
</parameter>
</ResourceParams>
</Context>
lets not forget web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Now finally using the JDBC reference in the java class
Context ctx = new InitialContext();
if(ctx == null )
throw new Exception("Boom - No Context");
DataSource ds =
(DataSource)ctx.lookup(
"java:comp/env/jdbc/TestDB");
InitialContext initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/my-datasource");
Connection conn = ds.getConnection();
JNDI access:
ApplicationContext.xml or server.xml first the prelim ConnectionPool params
<Environment name="tyrexDomainConfig" type="java.lang.String"
value="domain-config.xml"/>
<Environment name="tyrexDomainName" type="java.lang.String" value="myDomain"/>
Then in the same file the myDataSource
<Resource name="my-datasource" auth="Container" type="tyrex.resource.Resource"/>
<ResourceParams name="my-datasource">
<parameter>
<name>name</name>
<value>myDataSource</value>
</parameter>
</ResourceParams>and in $TOMCAT_HOME/conf/catalina.policy allow JNDI access to
the described resource
permission org.apache.naming.JndiPermission "jndi://comp.env/my-datasource";
Now the test in java via my-datasource
InitialContext initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("jndi:comp/env/my-datasource");
Connection conn = ds.getConnection();
More information on configuration and deployment to MySQL DB available at
http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
HTH
Martin
______________________________________________
Disclaimer and confidentiality note
Everything in this e-mail and any attachments relates to the official business
of Sender. This transmission is of a confidential nature and Sender does not
endorse distribution to any party other than intended recipient. Sender does
not necessarily endorse content contained within this transmission.
> Date: Wed, 13 Aug 2008 22:38:32 +0200
> From: [EMAIL PROTECTED]
> Subject: database application
> To: [email protected]
>
> Hi,
>
> Please help me.
>
> I use this introduction:
> http://localhost:8180/tomcat-docs/jndi-datasource-examples-howto.html
>
> database: mysql
> A simple java application works (see PS)
> [EMAIL PROTECTED]:/mnt/hda3/tyuk/dtest/java/database# java DbTableShow2
> +---------------+---------------+---------------+
> | id | foo | bar |
> +---------------+---------------+---------------+
> | 1 | hello | 12345 |
> | 2 | hellox | 123456 |
> +---------------+---------------+---------------+
>
>
> However the tomcat application fails:
> ----------------------------------------------
> description The server encountered an internal error () that prevented it
> from fulfilling this request.
> exception
> javax.servlet.ServletException: Unable to get connection, DataSource invalid:
> "org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of
> class '' for connect URL 'null'"
>
> org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:846)
>
> org.apache.jasper.runtime.PageContextImpl.access$11(PageContextImpl.java:784)
>
> org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:766)
> java.security.AccessController.doPrivileged(Native Method)
>
> org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:764)
> org.apache.jsp.jsp.test_jsp._jspService(test_jsp.java:81)
> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
> javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>
> org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
> org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
> javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> java.lang.reflect.Method.invoke(Method.java:597)
> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
> java.security.AccessController.doPrivileged(Native Method)
> javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:272)
>
> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
> ---------------
>
> Here my configuration file (/etc/tomcat5/server.xml:
> ----------------
> <!-- Server Configuration File for Tomcat 5 on Debian
> You can find a more complete example in /usr/share/doc/tomcat5/examples/
> -->
> <!-- Note that component elements are nested corresponding to their
> parent-child relationships with each other -->
> <!-- A "Server" is a singleton element that represents the entire JVM,
> which may contain one or more "Service" instances. The Server
> listens for a shutdown command on the indicated port.
> Note: A "Server" is not itself a "Container", so you may not
> define subcomponents such as "Valves" or "Loggers" at this level.
> -->
>
> <Server port="8005" shutdown="SHUTDOWN" debug="0">
>
> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
> debug="0"/>
> <Listener
> className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
> debug="0"/>
>
> <!-- Global JNDI resources -->
> <GlobalNamingResources>
>
> <!-- Test entry for demonstration purposes -->
> <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
>
> <!-- Editable user database that can also be used by
> UserDatabaseRealm to authenticate users -->
> <Resource name="UserDatabase" auth="Container"
> type="org.apache.catalina.UserDatabase"
> description="User database that can be updated and saved">
> </Resource>
> <ResourceParams name="UserDatabase">
> <parameter>
> <name>factory</name>
> <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
> </parameter>
> <parameter>
> <name>pathname</name>
> <value>conf/tomcat-users.xml</value>
> </parameter>
> </ResourceParams>
>
> </GlobalNamingResources>
>
> <!-- A "Service" is a collection of one or more "Connectors" that share
> a single "Container" (and therefore the web applications visible
> within that Container). Normally, that Container is an "Engine",
> but this is not required.
>
> Note: A "Service" is not itself a "Container", so you may not
> define subcomponents such as "Valves" or "Loggers" at this level.
> -->
> <!-- Define the Tomcat Stand-Alone Service -->
> <Service name="Tomcat-Standalone">
> <!-- A "Connector" represents an endpoint by which requests are received
> and responses are returned. Each Connector passes requests on to the
> associated "Container" (normally an Engine) for processing.
> -->
> <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8180 -->
> <Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
> port="8180" minProcessors="5" maxProcessors="75"
> enableLookups="true" acceptCount="10" debug="0"
> connectionTimeout="20000" useURIValidationHack="false" />
>
> <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
> <Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
> port="8009" minProcessors="5" maxProcessors="75"
> enableLookups="true" acceptCount="10" debug="0"
> connectionTimeout="20000" useURIValidationHack="false"
>
> protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
>
> <!-- An Engine represents the entry point (within Catalina) that processes
> every request. The Engine implementation for Tomcat stand alone
> analyzes the HTTP headers included with the request, and passes them
> on to the appropriate Host (virtual host). -->
>
> <!-- Define the top level container in our container hierarchy
> The name must be Catalina for correct function of the admin webapp
> -->
> <Engine name="Catalina" defaultHost="localhost" debug="0">
>
> <!-- Global logger unless overridden at lower levels -->
> <Logger className="org.apache.catalina.logger.FileLogger"
> prefix="catalina_" suffix=".log" timestamp="true"/>
>
> <!-- Because this Realm is here, an instance will be shared globally -->
> <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
> debug="0" resourceName="UserDatabase"/>
>
> <!-- Define the default virtual host -->
> <Host name="localhost" debug="0" appBase="webapps"
> unpackWARs="true" autoDeploy="true">
>
> <!-- Logger shared by all Contexts related to this virtual host. -->
> <Logger className="org.apache.catalina.logger.FileLogger"
> directory="logs" prefix="localhost_" suffix=".log"
> timestamp="true"/>
>
> <Context path="/jli/Q2_JSPs"
> docBase="/home/en/public_html/jsp/Beispiele"
> reloadable="true" />
>
> <Context path="/jli/Q3_JSPs"
> docBase="/home/en/public_html/jsp/Kapitel_4/Beispiele"
> reloadable="true" />
>
> <Context path="/jli/Q4_JSPs"
> docBase="/home/en/public_html/jsp/Kapitel_5/Beispiele"
> reloadable="true" />
>
> <!-- This is where I test -->
> <Context path="/jli/DB"
> docBase="/home/en/public_html/jsp/DB"
> reloadable="true" />
>
> <Context path="/ajax/k2"
> docBase="/home/en/public_html/jsp/ajax/Beispiele/kap2"
> reloadable="true" />
>
> <!-- This is what I added -->
>
> <Context path="/DBTest" docBase="DBTest"
> debug="5" reloadable="true" crossContext="true">
>
> <Logger className="org.apache.catalina.logger.FileLogger"
> prefix="localhost_DBTest_log." suffix=".txt"
> timestamp="true"/>
>
> <Resource name="jdbc/TestDB"
> auth="Container"
> type="javax.sql.DataSource"/>
>
> <ResourceParams name="jdbc/TestDB">
> <parameter>
> <name>factory</name>
>
> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
> </parameter>
>
> <!-- 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.
> -->
> <parameter>
> <name>maxActive</name>
> <value>100</value>
> </parameter>
>
> <!-- 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.
> -->
> <parameter>
> <name>maxIdle</name>
> <value>30</value>
> </parameter>
>
> <!-- 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.
> -->
> <parameter>
> <name>maxWait</name>
> <value>10000</value>
> </parameter>
>
> <!-- MySQL dB username and password for dB connections
> -->
> <parameter>
> <name>username</name>
> <value>javauser</value>
> </parameter>
> <parameter>
> <name>password</name>
> <value>javadude</value>
> </parameter>
>
> <!-- Class name for the old mm.mysql JDBC driver -
> uncomment this entry and comment next
> if you want to use this driver - we recommend
> using Connector/J though
> <parameter>
> <name>driverClassName</name>
> <value>org.gjt.mm.mysql.Driver</value>
> </parameter>
> -->
>
> <!-- Class name for the official MySQL Connector/J
> driver -->
> <parameter>
> <name>driverClassName</name>
> <value>com.mysql.jdbc.Driver</value>
> </parameter>
>
> <!-- 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.
> -->
> <parameter>
> <name>url</name>
>
> <value>jdbc:mysql://localhost:3306/javatest?autoReconnect=true</value>
> </parameter>
> </ResourceParams>
> </Context>
> <!-- End of This is what I added -->
>
> </Host>
> </Engine>
> </Service>
> </Server>
> -------------------------------------
> This is my /home/en/public_html/jsp/DB/WEB-INF/web.xml file:
> ---------------------
> <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
> version="2.4">
> <description>MySQL Test App</description>
> <resource-ref>
> <description>DB Connection</description>
> <res-ref-name>jdbc/TestDB</res-ref-name>
> <res-type>javax.sql.DataSource</res-type>
> <res-auth>Container</res-auth>
> </resource-ref>
> </web-app>
> ---------------
>
> I copied jstl.jar and standard.jar from tomcat into
> /home/en/public_html/jsp/DB/WEB-INF/lib
>
> /home/en/public_html/jsp/DB/jsp/test.jsp looks:
> ----------------------
> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
>
> <sql:query var="rs" dataSource="jdbc/TestDB">
> select id, foo, bar from testdata
> </sql:query>
>
> <html>
> <head>
> <title>DB Test</title>
> </head>
> <body>
>
> <h2>Results</h2>
>
> <c:forEach var="row" items="${rs.rows}">
> Foo ${row.foo}<br/>
> Bar ${row.bar}<br/>
> </c:forEach>
>
> </body>
> </html>
> -------------------------
>
> Thanks a lot in advance: Eleonora
>
>
> PS:
> Working java program:
> ---------------------------------
> // DbTableShow2.java
>
> import java.io.*;
> import java.sql.*;
>
> public class DbTableShow2
> {
> public static void main( String[] argv )
> {
> String sDbDrv=null, sDbUrl=null, sTable=null, sUsr="", sPwd="";
> if( 3 <= argv.length ) {
> sDbDrv = argv[0];
> sDbUrl = argv[1];
> sTable = argv[2];
> if( 4 <= argv.length ) sUsr = argv[3];
> if( 5 <= argv.length ) sPwd = argv[4];
> } else {
> // try {
> BufferedReader in = new BufferedReader(
> new InputStreamReader( System.in ) );
> // System.out.println( "Name des Datenbanktreibers eingeben (z.B.
> com.mysql.jdbc.Driver):" );
> // sDbDrv = in.readLine();
> sDbDrv = "com.mysql.jdbc.Driver";
> // System.out.println( "Url der Datenbank eingeben (z.B.
> jdbc:mysql://localhost:3306/MeineDb):" );
> // sDbUrl = in.readLine();
> // sDbUrl = "jdbc:mysql://localhost:3306/employees";
> sDbUrl = "jdbc:mysql://localhost:3306/javatest?autoReconnect=true";
> // System.out.println( "Name der Tabelle eingeben (z.B.
> MeineTestTabelle):" );
> // sTable = in.readLine();
> // sTable = "employee_data";
> sTable = "testdata";
> // System.out.println( "Benutzername (z.B. root):" );
> // sUsr = in.readLine();
> sUsr = "javauser";
> // System.out.println( "Passwort (z.B. mysqlpwd):" );
> // sPwd = in.readLine();
> sPwd = "javadude";
> // } catch( IOException ex ) {
> // System.out.println( ex );
> // }
> }
> if( null != sDbDrv && 0 < sDbDrv.length() &&
> null != sDbUrl && 0 < sDbUrl.length() &&
> null != sTable && 0 < sTable.length() ) {
> Connection cn = null;
> Statement st = null;
> ResultSet rs = null;
> try {
> // Select fitting database driver and connect:
> Class.forName( sDbDrv );
> cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
> st = cn.createStatement();
> rs = st.executeQuery( "select * from " + sTable );
> // Get meta data:
> ResultSetMetaData rsmd = rs.getMetaData();
> int i, n = rsmd.getColumnCount();
> // Print table content:
> for( i=0; i<n; i++ )
> System.out.print( "+---------------" );
> System.out.println( "+" );
> for( i=1; i<=n; i++ ) // Attention: first column with 1 instead of > 0
> System.out.print( "| " + extendStringTo14( rsmd.getColumnName( i )
> ) );
> System.out.println( "|" );
> for( i=0; i<n; i++ )
> System.out.print( "+---------------" );
> System.out.println( "+" );
> while( rs.next() ) {
> for( i=1; i<=n; i++ ) // Attention: first column with 1 instead of > 0
> System.out.print( "| " + extendStringTo14( rs.getString( i ) ) );
> System.out.println( "|" );
> }
> for( i=0; i<n; i++ )
> System.out.print( "+---------------" );
> System.out.println( "+" );
> } catch( Exception ex ) {
> System.out.println( ex );
> } finally {
> try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
> try { if( null != st ) st.close(); } catch( Exception ex ) {}
> try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
> }
> }
> }
>
> // Extend String to length of 14 characters
> private static final String extendStringTo14( String s )
> {
> if( null == s ) s = "";
> final String sFillStrWithWantLen = " ";
> final int iWantLen = sFillStrWithWantLen.length();
> final int iActLen = s.length();
> if( iActLen < iWantLen )
> return (s + sFillStrWithWantLen).substring( 0, iWantLen );
> if( iActLen > 2 * iWantLen )
> return s.substring( 0, 2 * iWantLen );
> return s;
> }
> }
> -----------------------end of working java program---
>
> --
> Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
> Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: [email protected]
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
_________________________________________________________________
Your PC, mobile phone, and online services work together like never before.
http://clk.atdmt.com/MRT/go/108587394/direct/01/