Man this has been a while since I've reached out to this list, but here it
goes.
I am using Tomcat 7 on Windows 7 64x and trying to configure a datasource
(MySQL DB running on a 2nd box) to use. I am able to connect from my local
to the remote using the mysql command line, so I do know the database is
reachable. I have a vanilla server.xml and I'm putting the configuration
in the context.xml. I've written a class to initialize connection objects
from the datasource. After this configuration, I did something that I
never do and is bad form, but I wrote a jsp that used the <sql> jstl to do
a test to the database, and it worked, so I thought perfect, the JNDI
lookup must be correct. Once I switched it over to only be used by the
backend code, I get a SQLException being thrown that says:
DataSource invalid: "java.sql.SQLException: No suitable driver found for
jdbc/dashboard"
While I am not 100% convinced that I need the <ResourceLink> tag in the
context.xml, but it's been pointed out multiple times that it is needed.
Is there something that I am missing here? Any advice or help you could
provide would be greatly appreciated. I do think it's a configuration
issue, but I've been known to be wrong before.
Here is the snippet from my web.xml -
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/dashboard</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Here is my context.xml -
<ResourceLink type="javax.sql.DataSource" name="jdbc/dashboard"
global="jdbc/DB" />
<Resource name="jdbc/dashboard" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="p05jg" password="testing"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://10.0.48.14:3306/dashboard"
poolPreparedStatments="true"
maxOpenPreparedStatements="200"
removeAbandoned="true" logAbandoned="true"
removeAbaondonedTimeout="300"/>
Here is my method for connection initialization -
private static Logger logger =
LoggerFactory.getLogger("ConnectionInitializer.class"); private static
final String dbName = "jdbc/DB"; private static final String envName =
"java:/comp/env";
public static Connection initialize () {
Connection connect = null;
Context context;
try {
context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup(dbName);
connect = dataSource.getConnection();
logger.debug("Connection returns schema: " + connect.getSchema());
} catch (NamingException nEx) {
logger.error("initialize threw a NamingException: ", nEx.getMessage());
nEx.printStackTrace();
return null;
} catch (SQLException sqlEx) {
logger.error("initialize threw a SQLException: ", sqlEx.getMessage());
sqlEx.printStackTrace();
return null;
}
return connect;
}
I have also tried another method for returning a connection object (same
method, just modified)
public static Connection initialize () {
Connection connect = null;
Context initContext;
Context envContext;
try {
initContext = new InitialContext();
envContext = (Context)initContext.lookup(dbName);
DataSource dataSource = (DataSource)envContext.lookup(envName + "/" +
dbName);
connect = dataSource.getConnection();
logger.debug("Connection returns schema: " + connect.getSchema());
} catch (NamingException nEx) {
logger.error("Uh-oh! - initializeConnection threw a NamingException: ",
nEx.getMessage());
logger.error("{} not found!", dbName);
nEx.printStackTrace();
return null;
} catch (SQLException sqlEx) {
logger.error("Uh-oh - initializeConnection threw a SQLException: ",
sqlEx.getMessage());
sqlEx.printStackTrace();
return null;
}
return connect;
}