Unable to get jndi data source - java

Unable to get jndi data source.
Error :
javax.naming.NameNotFoundException: Name [jdbc/MyLocalDB] is not bound in this Context. Unable to find [jdbc]
Environment : netbeans 8.0 + tomcat 8 + jdk8
In tomcat server at /conf/context.xml added below block:
<Resource name="jdbc/MyLocalDB"
global="jdbc/MyDB"
type="javax.sql.DataSource" auth="Container"/>
In tomcat server at /conf/server.xml added below block:
<Resource name="jdbc/MyDB"
global="jdbc/MyDB"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/ARBADMIN"
username="postgres"
password="postgres"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
Kept postgresql-9.3-1103.jdbc3 to tomcat /lib folder
Java code :
ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
con = ds.getConnection();
stmt = con.createStatement();
In netbeans ide whether i need to do any thing?

Related

java.sql.SQLException : Not a Wrapper of OracleConnection.class in Tomcat 9.0 Version

Using SpringMVC wit JDBC Template and tocmat 9.0 version and Oracle DB and jar file ojdbc6.jar file java1.8 version, the application is throwing an exception by saying
java.sql.SQLException: Not a wrapper of oracleConnection.class
in tomcat conf/context.xml
<Resource name="jdbc/db" auth="Container"
type="javax.sql.DataSource"
accessToUnderlyingConnectionAllowed="true"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
username="USER" password="password" maxTotal="20" maxIdle="10"
maxWaitMillis="-1" driverClassName="oracle.jdbc.driver.OracleDriver" url="URL" />
I am using following line in my code to use
OracleConnection conn= jdbcTemplate.getDataSource().getConnection().unwrap(OracleConnection.class);
ArrayDescriptor des=ArrayDescriptor.createDescriptor("XXX",conn);
at this point it throwing the error getting null , unable to fix the issue any help is appreciated.
at this point it it throwing the error , unable to fix the issue anyhelp is appreciated.

tomcat is ignoring the 'factory' attribute on a Resource

In my server.xml, I'm defining a resource:
<Resource name="global" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="user" password="betterThanThis"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:memory:test;create=true"/>
In my webapp context.xml I'm linking to it:
<ResourceLink name="local"
auth="Container"
global="global"
type="javax.sql.DataSource" />
In my web.xml I'm referencing it
<resource-ref>
<res-ref-name>local</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
And in my code, I'm using it
DataSource ds = InitialContext.doLookup("java:/comp/env/local");
ds.getConnection();
That last line throws an exception:
java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2167) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
Question: Why is a class in the org.apache.tomcat.dbcp.dbcp2 package throwing an error when I've specified factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" on my Resource?
It's not a missing jar problem, because I can see the Derby init in tomcat's logs. I don't think it's a naming issue, because when I change the name in InitialContext.doLookup("java:/comp/env/local") I get a naming error.
Edit: Full stack trace as requested:
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315) ~[na:1.8.0_151]
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2151) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
... 8 common frames omitted
Wrapped by: java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2167) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2037) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543) ~[tomcat8-dbcp-8.5.14.jar:8.5.14]
at com.moosemorals.webmail.Database.getConnection(Database.java:46) ~[classes/:na]
at com.moosemorals.webmail.Database.getAccountForAlias(Database.java:55) ~[classes/:na]
at com.moosemorals.webmail.authserver.PostfixLookupServer.lookup(PostfixLookupServer.java:61) ~[classes/:na]
at com.moosemorals.webmail.authserver.PostfixLookupServer.execute(PostfixLookupServer.java:40) ~[classes/:na]
at com.moosemorals.webmail.authserver.GenericServer$Client.run(GenericServer.java:151) [classes/:na]
It says "No suitable driver" so you may be missing some derby jdbc jar. Putting it in Tomcat lib may be needed.

Datasource Connection with Standalone Java Application

I have been able to configure my datasource in a web app but am unable to replicate that in a stand alone app.
Datasource is configured as server.xml file in tomcat server in config folder. How can I load the datasource from this file in a stand alone Java application?
If I try with
Context initialContext = new InitialContext();
DataSource dataSource = (DataSource) csDBEnvContext.lookup(DATASOURCE_NAME);
Its gives the following exception:
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial
Same code when tried using web application is executed fine.
username, password are redacted since it is production environment.
Here is the jdbc.java :
public static void main(String[] args) throws Exception {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/haryana");
//Connection conn = ds.getConnection();
try {
DatabaseMetaData dataSource = null;
conn = ds.getConnection();
} catch (Exception e) {
System.out.println("Exception while getting local JDBC Connection getLogsJdbcConnection(): " + e.getMessage());
}
Context.xml :
<Context crossContext="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/haryana" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="postgres"
password="postgres"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/fps_ws_db_feb17"/>
</Context>
web.xml file :
<resource-ref>
<description>Database connection resource</description>
<res-ref-name>jdbc/haryana</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
can anyone please help me to rectify the this Exception.

SEVERE: Unable to create initial connections of pool - tomcat 7 with context.xml file

I tried to run project on tomcat 7.0.52 and initialize to DB through context.xml file.
But it throws bunch of exceptions, I couldn't figure out what is wrong there.
Here is console output:
java.sql.SQLException: com.mysql.jdbc.Driver
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:486)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:144)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
Here is full stack trace.
Here is output to tomcat catalina log
snippet of web.xml:
<resource-ref>
<description>Travel Agency Datasource</description>
<res-ref-name>jdbc/onlinedb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
context.xml:
<Context>
<Resource name="jdbc/onlinedb"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
maxActive="20" maxIdle="10"
maxWait="-1"
username="root"
password="secret"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/travelagency?characterEncoding=utf8"/>
</Context>
ConnectionManager class:
public class ConnectionManager {
private static Logger log = Logger.getLogger(ConnectionManager.class);
public static Connection getConnection() throws SQLException {
Connection con = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinedb");
con = datasource.getConnection();
} catch (NamingException e) {
log.error(e);
}
return con;
}
}
mysql-connector-java-5.1.27-bin.jar is added to cp:
I tried to change content of context.xml file:
<resource-env-ref>
<description>Travel Agency Datasource</description>
<resource-env-ref-name>jdbc/onlinedb</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
But it keep failing.
How to solve this trouble?
You have to add a MySQL jdbc driver to the classpath.
Either put a MySQL binary jar to tomcat lib folder or add it to we application WEB-INF/lib folder.
You can find binary jar (Change version accordingly): https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.27
When you encounter exceptions like this, the most useful information is generally at the bottom of the stacktrace:
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
...
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246)
The problem is that Tomcat can't find com.mysql.jdbc.Driver. This is usually caused by the JAR containing the MySQL driver not being where Tomcat expects to find it (namely in the webapps/<yourwebapp>/WEB-INF/lib directory).
I use sprint-boot (2.1.1), and mysql version is 8.0.13. I add dependency in pom, solve my problem.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
MySQL Connector/J » 8.0.13 link: https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.13
MySQL Connector/J » All the version link:
https://mvnrepository.com/artifact/mysql/mysql-connector-java
I have also dealt with this exception after a fully working context.xml setup was adjusted. I didn't want environment details in the context.xml, so I took them out and saw this error. I realized I must fully create this datasource resource in code based on System Property JVM -D args.
Original error with just user/pwd/host removed:
org.apache.tomcat.jdbc.pool.ConnectionPool init
SEVERE: Unable to create initial connections of pool.
Removed entire contents of context.xml and try this:
Initialize on startup of app server the datasource object sometime before using first connection. If using Spring this is good to do in an #Configuration bean in #Bean Datasource constructor.
package to use: org.apache.tomcat.jdbc.pool.*
PoolProperties p = new PoolProperties();
p.setUrl(jdbcUrl);
p.setDriverClassName(driverClass);
p.setUsername(user);
p.setPassword(pwd);
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setValidationQueryTimeout(100);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(5);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(5);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setPoolProperties(p);
return ds;

Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL

I am getting the above exception, and I don't know why.
Here is some more information:
Cannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql://localhost:3306/staffing_2014'
I am using Spring. In the Spring application context, I have the following dataSource:
<jee:jndi-lookup id="dataSource"
jndi-name="jdbc/StaffingDB"
expected-type="javax.sql.DataSource" />
It seems to read the database URL and credentials OK from tomcat's context.xml:
<Resource name="jdbc/StaffingDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="xxx" password="yyy" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/staffing_2014"/>
Before anyone suggests Googling it, I have. The obvious answers I've found have been:
Database URL malformed? - checked and OK.
MySQL driver in classpath? Yes- jar is in $TOMCAT_HOME/lib
Any other suggesions?
EDIT - way down the bottom:
java.sql.SQLException: No suitable driver
java.sql.DriverManager.getDriver(DriverManager.java:279)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
What version of Tomcat are you using? In some Tomcats (T5), TOMCAT_HOME/lib may not be the right location. You have to put the driver in Tomcat's endorsed folder which could be
TOMCAT_HOME/endorsed or
TOMCAT_HOME/shared/lib
Check your Tomcat setup.

Categories