JNDI
用在数据库连接JDBC这块,首先说一下,不适用JNDI,单单使用JDBC连接数据库的代码如下:
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并进行SQL操作 */
......
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
}catch(SQLException e) {}
}
那么这种情况出现的问题是,如果数据库连接出现修改数据源的一些参数,例如数据库服务器名称MyDBServer、用户名和口令都可能需要改变,导致JDBC的URL需要修改。或者数据库改用产品等。只能去源代码中进行修改,可是最好的方式是,程序员只是修改这些参数就好,但不能是去源代码中去修改,这样也没有保证系统的安全性。
所以提出JNDI。
用了JNDI之后:
首先,在J2EE容器中配置JNDI参数,定义一个数据源,也是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体操作:
1.配置数据源
在一个.xml文件中设置数据源的相关参数
1 <?xml version="1.0" encoding="UTF-8"?>
2 <datasources>
3 <local-tx-datasource>
4 <jndi-name>MySqlDS</jndi-name>
5 <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
6 <driver-class>com.mysql.jdbc.Driver</driver-class>
7 <user-name>root</user-name>
8 <password>rootpassword</password>
9 <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
10 <metadata>
11 <type-mapping>mySQL</type-mapping>
12 </metadata>
13 </local-tx-datasource>
14 </datasources>
定义一个MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。
2.在程序中引用数据源:
Connection conn=null;
try {
Context ctx=new InitialContext();
Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源
DataSource ds=(Datasource)datasourceRef;
conn=ds.getConnection();
/* 使用conn进行数据库SQL操作 */
......
c.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) { }
}
}
总结:
使用JNDI,在系统部署后,如果数据库的相关参数变更,只要需要重新配置.xml文件的参数,只要保证数据源的名称不变,那么程序源代码就无需修改。
由此可见,JNDI避免了程序与数据库之间的额紧耦合,使应用更加易于配置,易于部署。