JNDI is a protocol
/ mechanism used to lookup data / information, resources from a SPI that obeys
the JNDI format. JNDI is available for manipulating naming services and
directory services only. Examples include JNDI trees of EJB Containers, LDAP
Directory Servers etc...
JDBC is a database
specific protocol that Database vendors support for Java Data Access.
JNDI
is used when your are trying to advertise and lookup data from a naming service
or directory service and JDBC is used when you are querying / updating data in
a Database server.
Difference between JDBC and JNDI
Connection conn = null;
try {
Class.forName ("com.mysql.jdbc.Driver", true, Thread.currentThread
(). GetContextClassLoader ());
conn = DriverManager.getConnection ("jdbc: mysql :/ / MyDBServer? user =
*** & password = ****");
.....
conn.close ();
}
catch (...) {...} finally {
the if (conn! = null) {
try {
conn.close ();
}
catch (...) {...}
}
}
Problems?
1, the database server name MyDBServer username and password may need to be
modified, and consequent the JDBC URL repairs you want to modify;
2, the database may be the use of other products;
With the increase in the actual terminal, the original configuration of the connection
pool parameters may need to be adjusted;
The solution database-level programmers do not have to care about things
that only need to know how to refer to
The JNDI appear.
Define the data source, that is, JDBC reference parameters, set a name to the
data source;
Data source name in the program by referencing the data source to access the
database;
/ / Jndi connection
Context initCtx = new InitialContext ();
Context envCtx = (Context) initCtx.lookup ("java: comp / env");
DataSource ds = (DataSource) envCtx.lookup ("jdbc / webtest");
conn = ds.getConnection ();
/ / Jdbc connection
Class.forName ("com.mysql.jdbc.Driver", true, Thread.currentThread
(). GetContextClassLoader ());
conn = DriverManager.getConnection ("jdbc: mysql :/ / localhost / mismain?
user = root & autoReconnect = true");
Programmers to develop, you know you want to develop the application to
access the MySQL database, so a reference to the MySQL JDBC driver class is
encoded by using the appropriate JDBC URL to connect to the database.
Just like the following code:
Connection conn = null;
try ... {
Class.forName ("com.mysql.jdbc.Driver", true, Thread.currentThread
(). GetContextClassLoader ());
conn = DriverManager.getConnection ("jdbc: mysql :/ / MyDBServer? user =
qingfeng & password = mingyue");
......
conn.close ();
} Catch (Exception e) {
e.printStackTrace ();
} Finally ... {
the if (conn! = null) ... {
try ... {
conn.close ();
} Catch (SQLException e) ... {}
}
}
This is the traditional approach, but also the previously common practice of
non-Java programmers (such as Delphi, VB, etc.). This approach generally
does not produce in the small-scale development process, as long as the
programmers familiar with the Java language, understand the technology and
MySQL JDBC can quickly develop the appropriate application.
No JNDI approach the problems: 1, database server name MYDBSERVER, user
name and password may need to be changed, which led to the JDBC URL need to be
modified; 2, the database may switch to other products, such as switching to
DB2 or Oracle, triggered JDBC driver package and class names need to be
modified; 3, with the increase of the actual use of the terminal, the original
configuration of the connection pool parameters may need to be adjusted; ...
Solution: the programmer should not need to care about what specific
database background? JDBC driver? What is JDBC URL format? What is the user
name and password to access the database? "And so these problems, programmers
write the program should no references to the JDBC driver, server name, user
name or password - not even database pool or connection management. But
these issues to the J2EE container to configure and manage, the programmer need
only reference to these configuration and management.
Thus, there is a JNDI.
JNDI approach: First, configure JNDI parameters, define a data source in
a J2EE container, which is the the JDBC reference parameter set a name to the
data source; reference data source, the data source name in the program to
access the back-end database.
The specific operation is as follows (in JBoss as an example):
1, configure the data source in JBoss D :/ jboss420GA/docs/examples/jca
file folder, there are a lot of different databases referenced data source
definition template. Copy the mysql-ds.xml file to the server you're
using, such as D to :/ jboss420GA/server/default/deploy.
Mysql-ds.xml file to modify the content, so to through JDBC correct access your
MySQL database,
As follows:
Connection conn = null;
try ... {
Class.forName ("com.mysql.jdbc.Driver", true, Thread.currentThread
(). GetContextClassLoader ());
conn = DriverManager.getConnection ("jdbc: mysql :/ / MyDBServer? user =
qingfeng & password = mingyue");
......
conn.close ();
} Catch (Exception e) {
e.printStackTrace ();
} Finally ... {
the if (conn! = null) ... {
try ... {
conn.close ();
} Catch (SQLException e) ... {}
}
}
<? Xml version = "1.0" encoding = "UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name> MySqlDS </ jndi-name>
<connection-url> jdbc: mysql :/ / localhost: 3306/lw </
connection-url>
<driver-class> com.mysql.jdbc.Driver </ driver-class>
<user-name> root </ user-name>
<password> rootpassword </ password>
<exception-sorter-class-name> org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</ exception-sorter-class-name>
<metadata>
<type-mapping> mySQL </ type-mapping>
</ Metadata>
</ Local-tx-datasource>
</ Datasources>
Defined a the named MySqlDS data source, parameters include the URL of
the JDBC driver class name, user name and password.
2 references in the program data source:
Connection conn = null; try ... {
Context ctx = new InitialContext ();
Object datasourceRef = ctx.lookup ("java: MySqlDS"); / / the Citation
data source DataSource ds = (DataSource) DataSourceRef; the conn = to the
ds.getConnection ();
......
c.close ();
} Catch (Exception e) {
e.printStackTrace ();
} Finally ... {
the if (conn! = null) ... {
try ... {
conn.close ();
} Catch (SQLException e) ... {}
}
}
Using JDBC directly or referenced by JNDI data source programming code
is almost the same, but now the program can not care about the specific JDBC
parameters.
After the deployment of the system, if the relevant parameters of the
database changes, you only need to reconfigure mysql-ds.xml modify the JDBC
parameters, as long as the name of the data source is the same, there is no
need to modify the source code.
Thus, JNDI to avoid the tight coupling between the program and database
to make the application easier to configure, easy to deploy.